今天二刷这道题
1 /** 2 * Definition for singly-linked list. 3 * public class ListNode { 4 * int val; 5 * ListNode next; 6 * ListNode(int x) { val = x; } 7 * } 8 */ 9 class Solution { 10 public ListNode removeNthFromEnd(ListNode head, int n) { 11 ListNode slow = head,fast = head; 12 while(fast != null){ 13 14 if(n < 0){ 15 slow = slow.next; 16 } 17 n--; 18 fast = fast.next;//先走了n+1步 19 } 20 if(n == 0){ 21 return head.next; 22 } 23 ListNode t = slow.next; 24 slow.next = slow.next.next; 25 t.next = null; 26 return head; 27 } 28 }
使用快慢指针的做法只需要扫描一趟,但是,有一个边界问题要特殊处理,就是当要删除的节点就是第一个时,这里使用了一个计数器n,若n=0,删除的节点就是第一个,那返回头结点的下一个节点即可,也可以将头结点释放,再返回头结点的下一个节点。