• [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 };
  • 相关阅读:
    Activity表单传值问题
    求助~!线程里不能MediaRecorder.start()
    获取浏览器的宽高:
    WebStorm快捷键收集
    CSS中强大的EM
    常用global.css
    常用base.css
    自适应网页设计的方法(手机端良好的访问体验)
    还需要学习的十二种CSS选择器
    js 根据屏幕大小调用不同的css文件
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4628541.html
Copyright © 2020-2023  润新知