2022-7-28 剑指offer-链表-快慢指针

剑指 Offer II 021. 删除链表的倒数第 n 个结点

难度中等

给定一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点

 1 /**
 2  * Definition for singly-linked list.
 3  * public class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode() {}
 7  *     ListNode(int val) { this.val = val; }
 8  *     ListNode(int val, ListNode next) { this.val = val; this.next = next; }
 9  * }
10  */
11 class Solution {
12     public ListNode removeNthFromEnd(ListNode head, int n) {
13         ListNode dummy=new ListNode();
14         dummy.next=head;
15         ListNode slow=dummy,fast=dummy;
16         for (int i=0;i<n;i++){
17             fast=fast.next;
18         }
19         while (fast.next!=null){
20             fast=fast.next;
21             slow=slow.next;
22         }
23         slow.next=slow.next.next;
24         return dummy.next;
25     }
26 }

思路:快慢指针来找到倒数n个节点,虚拟头节点避免去掉头节点的情况。

剑指 Offer II 022. 链表中环的入口节点

难度中等

给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点。如果链表无环,则返回 null

为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。

说明:不允许修改给定的链表。

 1 /**
 2  * Definition for singly-linked list.
 3  * class ListNode {
 4  *     int val;
 5  *     ListNode next;
 6  *     ListNode(int x) {
 7  *         val = x;
 8  *         next = null;
 9  *     }
10  * }
11  */
12 public class Solution {
13     public ListNode detectCycle(ListNode head) {
14         
15         ListNode fast=head,slow=head;
16         while (fast!=null&&fast.next!=null){
17             slow=slow.next;
18             fast=fast.next.next;
19             if (fast==slow) break;
20         }
21         //System.out.print(fast.val);
22         if (fast==null||fast.next==null) return null;
23         fast=head;
24         while (fast!=slow){
25             slow=slow.next;
26             fast=fast.next;
27         }
28         return fast;
29     }
30 }

思路:先通过快慢指针,判断是否有环,在相交处,重置快指针,通过长度相等公式可以保证在环入口处相遇。

posted on 2022-07-28 09:42  阿ming  阅读(14)  评论(0编辑  收藏  举报

导航