题目:
Given a linked list, remove the nth 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:
Given n will always be valid.
Try to do this in one pass.
解题思路:
先用快慢指针的思想,找到要删除的节点和其前驱(只需遍历一遍)。然后将其删除即可。
代码:
1 struct ListNode { 2 int val; 3 ListNode *next; 4 ListNode(int x) : val(x), next(NULL) {} 5 }; 6 7 class Solution { 8 public: 9 ListNode *removeNthFromEnd(ListNode *head, int n) { 10 if (head == NULL) return NULL; 11 12 ListNode *pre = head, *slow = head, *quick = head; 13 for (int i = 1; i <= n; i++) quick = quick->next; 14 15 while (quick != NULL) { 16 pre = slow; 17 slow = slow->next; 18 quick = quick->next; 19 } 20 if (slow != head) { 21 pre->next = slow->next; 22 delete slow; 23 slow = NULL; 24 } 25 else { 26 head = slow->next; 27 delete slow; 28 } 29 return head; 30 } 31 };