2022-7-28 剑指offer-链表-快慢指针
给定一个链表,删除链表的倒数第 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个节点,虚拟头节点避免去掉头节点的情况。
给定一个链表,返回链表开始入环的第一个节点。 从链表的头节点开始沿着 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 }
思路:先通过快慢指针,判断是否有环,在相交处,重置快指针,通过长度相等公式可以保证在环入口处相遇。