• [LeetCode] Remove Nth Node From End of List


    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 };
  • 相关阅读:
    Zju1876 Edit Step Ladders
    Candy糖果盒
    哈希
    最长上升子序列 nlogn
    电费结算
    【luoguP5656】二元一次不定方程(gcd,exgcd,裴蜀定理,不定方程初步)
    DP技巧
    高精
    【CSP烤前注意】
    [Jsoi2015] 种花
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4628541.html
Copyright © 2020-2023  润新知