Given a linked list, removeNTh node from the end of list and return its head.
For 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:
GivenNWill always be valid.
Try to do this in one pass.
Thought 1: Double pointer thought. Two pointers are separated by n-1. Each time two pointers are taken one step backward. When the next pointer has no successor, the previous pointer is the node to be deleted. Note: When deleting a node, You need to delete the pointer's precursor pre; add dummy head to handle special cases of deleting a header node.
public class Solution {public ListNode removeNthFromEnd(ListNode head, int n) {if (head == null)return null;ListNode dummyHead = new ListNode(-1);dummyHead.next = head;ListNode s = head;ListNode t = head;n = n - 1;for (int i = 0; i < n; i++) {t = t.next;}ListNode preS = dummyHead;while (t.next != null) {preS = preS.next;s = s.next;t = t.next;}// remove spreS.next = s.next;s.next = null;return dummyHead.next;}public static void main(String[] args) {ListNode head = new ListNode(1);head.next = new ListNode(2);head.next.next = new ListNode(3);head.next.next.next = new ListNode(4);head.next.next.next.next = new ListNode(5);ListNode newHead = new Solution().removeNthFromEnd(head, 1);}}