Given a linked list, remove the n-th node from the end of list and return its head.
Example:
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Follow up:
Could you do this in one pass?
题意: 删除链表倒数第N个节点
Solution1: Two Pointers(fast and slow)
1. Let fast pointer to move n steps in advance, making sure there is n steps gap between fast and slow
2. Move fast and slow pointer together until fast.next == null
code
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 10 /* 11 Time: O(n) 12 Space: O(1) 13 */ 14 class Solution { 15 public ListNode removeNthFromEnd(ListNode head, int n) { 16 ListNode dummy = new ListNode(-1); 17 dummy.next = head; 18 ListNode slow = dummy, fast = dummy; 19 20 for (int i = 0; i < n; i++) // fast先走n步 21 fast = fast.next; 22 23 while(fast.next != null) { // fast和slow一起走 24 slow = slow.next; 25 fast = fast.next; 26 } 27 //直接skip要删除的节点 28 slow.next = slow.next.next; // 思考为何不能写成 slow.next = fast; 29 return dummy.next; 30 } 31 }