首页 > 其他 > 详细

[LeetCode] Remove Nth Node From End of List

时间:2015-07-07 22:23:03      阅读:231      评论:0      收藏:0      [点我收藏+]

This is a classic problem of linked list. You may solve it using two pointers. The tricky part lies in the head pointer may also be the one that is required to be removed. Handle this carefully.

 1 class Solution {
 2 public:
 3     ListNode *removeNthFromEnd(ListNode *head, int n) {
 4         ListNode *pre, *cur;
 5         pre = cur = head;
 6         int i = 0;
 7         for(; i < n; i++)
 8             cur = cur -> next;
 9         if(!cur) return head -> next;
10         while(cur -> next) {
11             pre = pre -> next;
12             cur = cur -> next;
13         }
14         pre -> next = pre -> next -> next;
15         return head;
16     }
17 };

You may create a dummy that points to head to facilitate the removal.

 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         ListNode* dummy = new ListNode(0);
 5         dummy -> next = head;
 6         ListNode* pre = dummy;
 7         ListNode* cur = dummy;
 8         for (int i = 0; i < n; i++)
 9             cur = cur -> next;
10         while (cur -> next) {
11             pre = pre -> next;
12             cur = cur -> next;
13         }
14         ListNode* del = pre -> next;
15         pre -> next = del -> next;
16         delete del;
17         return dummy -> next;
18     }
19 };

This link has a much shorter solution using pointers to pointers, which is a little difficult to understand. The code is rewritten below.

 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         ListNode** pre = &head;
 5         ListNode* cur = head;
 6         for (int i = 1; i < n; i++)
 7             cur = cur -> next;
 8         while (cur -> next) {
 9             pre = &((*pre) -> next);
10             cur = cur -> next;
11         }
12         *pre = (*pre) -> next;
13         return head;
14     }
15 };

There is also a recursive solution to this problem in the answers in the above link. 

 1 class Solution {
 2 public:
 3     ListNode* removeNthFromEnd(ListNode* head, int n) {
 4         return countRemove(head, n) == 0 ? head -> next : head;
 5     }
 6 private:
 7     int countRemove(ListNode* node, int n) {
 8         if (!(node -> next)) return n - 1;
 9         int rest = countRemove(node -> next, n);
10         if (!rest) node -> next = node -> next -> next;
11         return rest - 1;
12     }
13 };

 

[LeetCode] Remove Nth Node From End of List

原文:http://www.cnblogs.com/jcliBlogger/p/4628541.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!