LeetCode OJ

题目:

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 };
原文地址:https://www.cnblogs.com/dongguangqing/p/3813430.html