链表
链表
Huiex胖子君
广告位招租
展开
-
剑指 Offer 35. 复杂链表的复制
主要思路是:以为题目的要求返回的链表和给的链表位置不一样,所以要新建结点将新建结点和原结点放入Map中,key为原结点,value为新建结点然后通过在map中取出原结点,得到新节点,让新节点next指向 map中原结点的next对应新节点连接random也同理public class Offer35 { /** 题目的要求返回的链表和给的链表位置不一样,所以要新建结点*/ public Node copyRandomList(Node head) { if (hea.原创 2021-12-08 18:24:12 · 274 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
注意判断链表的第一个结点(也就是head结点)是否为目标结点和链表最后一个结点(因为用的是但指针,无法判断最后一个结点),需要在跳出循环后单独判断public class Offer18 { public ListNode deleteNode(ListNode head, int val) { if (head == null) return null; /** 找到目标结点的前一个结点temp*/ ListNode temp = head;原创 2021-11-29 16:33:39 · 56 阅读 · 0 评论 -
剑指 Offer 30. 包含min函数的栈
用链表实现一个栈重点在结点中设置一个min属性,用来存放当前结点和它下面栈元素的最小值还有就是利用头插法,简单方便public class Offer30 { private Node head; public Offer30() { } public void push(int x) { //如果当前栈为空 就让头结点指向当前结点,最小值为x if (head == null) head = new Node(x,x,nul原创 2021-11-27 14:58:40 · 242 阅读 · 1 评论 -
剑指 Offer 25. 合并两个排序的链表
先找递归终止的界限 ,找终止界限的前一个情况,找出联系(即递推公式)递归终止的界限 要么 l1 为空l,要么 l2 为空找终止界限的前一个情况,、l1 --> nulll2 -->null联系就是l1.next = mergeTwoLists(l1.next,l2);orl2.next = mergeTwoLists(l1,l2.next);public ListNode mergeTwoLists(ListNode l1, ListNode l2) {原创 2021-11-19 11:37:44 · 289 阅读 · 0 评论 -
剑指 Offer 22. 链表中倒数第k个节点
这个题目的主要问题就是怎么找到目标结点的位置当然可以用两次遍历,第一遍确定位置,第二遍找到可以定义一个指针指向链表开始的后面的第K个位置,那么从头结点到k,也就是0到k这端就相当于一个气泡,两个指针向后移,当k出去时(指向k的指针指向null,也就是出链表了),那么前面的指针指向的就是目标结点,就好像一个气泡往上浮(我愿称之为冒泡算法)public ListNode getKthFromEnd(ListNode head, int k) { /** 两个指针,一个指向开始位置0,一个指原创 2021-11-16 21:58:07 · 367 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
和官方题解思路是一样的,但是细节上的思想不同,但也AC了关键是三个1.要将上一个结点存起来2.要有一个指针指向下一个结点3.边界问题,要注意什么时候跳出循环public ListNode reverseList(ListNode head) { /** 如果该链表为空 或者 为一个结点*/ if (head == null || head.next == null){ return head; } /**原创 2021-11-16 21:49:50 · 348 阅读 · 0 评论 -
19. 删除链表的倒数第 N 个结点
先遍历一下整个链表的长度count,然后用count-n+1计算待删除的结点在链表的位置如何找到该结点的前一个结点temp.next = temp.next.next进行删除public static ListNode removeNthFromEnd(ListNode head, int n) { ListNode temp = head; int count = 1; for(int i = 0; temp.next != null; i++) { temp = temp.ne原创 2021-11-06 18:49:56 · 76 阅读 · 0 评论 -
92. 反转链表 II
public static ListNode reverseBetween(ListNode head, int left, int right) { //找到4个点 1.左结点 2.左结点前一个结点 3.右结点 4.右结点之后的结点 //在头结点之前创建一个结点 ListNode foremost = new ListNode(-1); foremost.next = head; //寻找4个点 使用一个辅助结点 .原创 2021-11-06 17:35:17 · 70 阅读 · 0 评论 -
83.从有序链表中删除重复节点
还是双指针,依次遍历 比较同样注意边界的判断条件,还有参数为空的条件public static ListNode deleteDuplicates(ListNode head) { if(head == null) { return null; } //先定义两个辅助指针 ListNode forward = head.next;//前 ListNode rear = head;//后 //开始循环判断 while(rea原创 2021-11-06 09:20:12 · 127 阅读 · 0 评论 -
合并两个有序链表
递归不会直接用while循环迭代先定义一个结点,ListNode head = new ListNode(-1);,不能用ListNode head = null;然后定义一个辅助指针ListNode prev = head;,主要思想就是辅助指针,根据两个链表边的当前头结点的比较,判断去指向谁,如果l1 != null && l2 != null就开始常规的 指针指向操作了prev.next = l1; l1 = l1.next; prev = prev.next;然后原创 2021-10-30 15:47:45 · 82 阅读 · 1 评论 -
206. 反转链表
https://leetcode-cn.com/problems/reverse-linked-list/solution/shi-pin-jiang-jie-die-dai-he-di-gui-hen-hswxy/定义三个辅助结点一个指向head前的null prev一个指向当前结点 curr一个指向当前结点的下一个结点 nextNode先将curr的next指向prev,然后同时将curr 和 prev 向后移动一个位置,nextNode结点的作用就在于 curr指原创 2021-10-30 09:40:05 · 69 阅读 · 0 评论 -
160. 相交链表
一.利用哈希集合先将其中一个链表添加到HashSet中,再利用contains方法查询是否有相同的结点,如果有,说明相交,没有,就证明平行缺点就是慢public static ListNode getIntersectionNode(ListNode headA, ListNode headB) { HashSet<ListNode> setAb = new HashSet<ListNode>(); ListNode temp = headA; w原创 2021-10-27 11:33:22 · 95 阅读 · 0 评论