数据结构 Java DS——分享部分链表标题 (2)

打印 上一主题 下一主题

主题 1000|帖子 1000|积分 3000

前言

关于JAVA的链表,笔者已经写了两篇博客来先容了,今天给笔者们带来第三篇,也是分享了一些笔者写过的,觉得挺好的标题,链接也已经挂上了,笔者们可以去看看
入门数据结构JAVA DS——如何实现浅易的单链表(用JAVA实现)-CSDN博客
数据结构 Java DS——链表部分经典标题 (1)-CSDN博客

标题一   ——  链表的回文结构


链表的回文结构_牛客题霸_牛客网 (nowcoder.com)


鄙人在这分享一个最轻易想到的思路吧,和之前判断数组是否回文的"双指针法"类似,不同的是这是一个单链表,我们这能获得下一个结点的地址而不能获得前一个,因此,你想到了什么?
没错,反转一下,我们将链表反转一下,然后对比他们是否是完全一致的,不是,return false;

以下是题解的代码
  1. import java.util.*;
  2. /*
  3. public class ListNode {
  4.     int val;
  5.     ListNode next = null;
  6.     ListNode(int val) {
  7.         this.val = val;
  8.     }
  9. }*/
  10. public class PalindromeList {
  11.     public boolean chkPalindrome(ListNode A) {
  12.         // write code here
  13.         ListNode cur = A;
  14.         ListNode cur2 = reverseList(A);
  15.         while (cur != null && cur2 != null) {
  16.             if (cur.val != cur2.val) {
  17.                 return false;
  18.             }
  19.             cur = cur.next;
  20.             cur2 = cur2.next;
  21.         }
  22.         return true;
  23.     }
  24.     private ListNode reverseList(ListNode head) {
  25.         if (head == null) {
  26.             return null;
  27.         }
  28.         ListNode pre = null;
  29.         ListNode cur = head;
  30.         while (cur != null) {
  31.             ListNode nextnode = cur.next;
  32.             cur.next = pre;
  33.             pre = cur;
  34.             cur = nextnode;
  35.         }
  36.         return pre;
  37.     }
  38. }
复制代码
不管是思路还是代码都很清晰,有助于锻炼头脑,固然,也很基础



标题二    ——  二进制链表转整数       

1290. 二进制链表转整数 - 力扣(LeetCode)
这道题笔者觉得,不光考察你对链表的理解,也考察你对于二进制转十进制这个基本知识的理解


笔者也分享一下笔者觉得最轻易想到的思路,依据公式,我们都是从最右边的数开始算起,然后看他的位次决定他要和 "2的几次方" 相乘,末了得到和
那为何不反转这个链表,然后举行遍历,当遍历到非0的数时,举行运算,同时,用一个变量体现"2的权值",每次遍历完一个结点,就要指数就要+1


  1. class Solution {
  2.     public int getDecimalValue(ListNode head)
  3.     {
  4.      ListNode head1=reverseList(head);
  5.      ListNode cur=head1;
  6.     int a=1;
  7.     int sum=0;
  8.      while(cur!=null)
  9.      {
  10.         if(cur.val==1)
  11.         {
  12.               sum+=a;
  13.         }
  14.         cur=cur.next;
  15.         a=a*2;
  16.      }
  17.      return sum;
  18.     }
  19. public ListNode reverseList(ListNode head) {
  20. ListNode pre=null;
  21. ListNode cur=head;
  22. while(cur!=null)
  23. {
  24.    ListNode nextnode=cur.next;
  25.    cur.next=pre;
  26.    pre=cur;
  27.    cur=nextnode;
  28. }
  29. return pre;
  30. }
  31. }
复制代码
请看代码,我们起首用a体现 2的n次幂 ,sum体现总和,每次符合条件就相加,不符合就跳过,但是2的质数一定是在加的,笔者在快速幂那一篇博客也提到过

数论, 一篇博客带你初识快速幂,已经为什么必要快速幂-CSDN博客

sum 就是末了的和

标题三  —— 计划链表

707. 计划链表 - 力扣(LeetCode)



 这道题包罗了了一些常见的链表操作,以是笔者觉得值得一写,可以提高我们对于链表的理解
  1. class MyLinkedList {
  2.     public ListNode head;
  3.     public int usesize;
  4.     static class ListNode {
  5.         int val;
  6.         ListNode next;
  7.         public ListNode(int val) {
  8.             this.val = val;
  9.         }
  10.     }
  11.     public MyLinkedList() {
  12.         this.head = null;
  13.         this.usesize = 0;
  14.     }
  15.     public int get(int index) {
  16.         if (index < 0 || index >= usesize) {
  17.             return -1;
  18.         }
  19.         ListNode cur = head;
  20.         for (int i = 0; i < index; i++) {
  21.             cur = cur.next;
  22.         }
  23.         return cur.val;
  24.     }
  25.     public void addAtHead(int val) {
  26.         ListNode listNode = new ListNode(val);
  27.         listNode.next = head;
  28.         head = listNode;
  29.         usesize++;
  30.     }
  31.     public void addAtTail(int val) {
  32.         ListNode listNode = new ListNode(val);
  33.         if (head == null) {
  34.             head = listNode;
  35.         } else {
  36.             ListNode cur = head;
  37.             while (cur.next != null) {
  38.                 cur = cur.next;
  39.             }
  40.             cur.next = listNode;
  41.         }
  42.         usesize++;
  43.     }
  44.     private ListNode findIndex(int idx) {
  45.         if (idx == 0) return null;  // 对于 idx == 0,返回 null 作为前一个节点不存在的标志
  46.         ListNode cur = head;
  47.         for (int i = 0; i < idx - 1; i++) {
  48.             cur = cur.next;
  49.         }
  50.         return cur;
  51.     }
  52.     public void addAtIndex(int index, int val) {
  53.         if (index < 0 || index > usesize) {
  54.             return;
  55.         }
  56.         if (index == 0) {
  57.             addAtHead(val);
  58.         } else if (index == usesize) {
  59.             addAtTail(val);
  60.         } else {
  61.             ListNode temp = findIndex(index);
  62.             ListNode listNode = new ListNode(val);
  63.             listNode.next = temp.next;
  64.             temp.next = listNode;
  65.             usesize++;
  66.         }
  67.     }
  68.     public void deleteAtIndex(int index) {
  69.         if (index < 0 || index >= usesize) {
  70.             return;
  71.         }
  72.         if (index == 0) {
  73.             head = head.next;
  74.         } else {
  75.             ListNode temp = findIndex(index);
  76.             temp.next = temp.next.next;
  77.         }
  78.         usesize--;
  79.     }
  80. }
  81. /**
  82. * Your MyLinkedList object will be instantiated and called as such:
  83. * MyLinkedList obj = new MyLinkedList();
  84. * int param_1 = obj.get(index);
  85. * obj.addAtHead(val);
  86. * obj.addAtTail(val);
  87. * obj.addAtIndex(index,val);
  88. * obj.deleteAtIndex(index);
  89. */
复制代码
我们可以通过题解代码看到,这是一个很"系统"的代码,写的很完备,思路也不难,以是笔者就不做多余的说明了,代码应该写的很清楚


结尾


笔者还是会持续更新写过的标题,推荐给和笔者一样刚入门的初学者,请多多支持笔者,无收益写作,纯用爱发电.

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

忿忿的泥巴坨

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表