19. Remove Nth Node From End of List
https://leetcode.com/problemset/all/?search=19
涉及链表删除操作的时候,稳妥起见都用 dummy
node,省去很多麻烦。因为不一定什么时候 head 就
被删了。
/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */ public class Solution { public ListNode removeNthFromEnd(ListNode head, int n) { if (head == null) { return head; } int len = 0; ListNode dummy = new ListNode(0); dummy.next = head; while (head != null) { len++; head = head.next; } head = dummy; int index = len - n; while (index > 0) { head = head.next; index--; } head.next = head.next.next; return dummy.next; } }
快慢指针
public ListNode removeNthFromEnd(ListNode head, int n) { ListNode start = new ListNode(0); ListNode slow = start, fast = start; slow.next = head; //Move fast in front so that the gap between slow and fast becomes n for(int i=1; i<=n+1; i++) { fast = fast.next; } //Move fast to the end, maintaining the gap while(fast != null) { slow = slow.next; fast = fast.next; } //Skip the desired node slow.next = slow.next.next; return start.next; }