zoukankan      html  css  js  c++  java
  • [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 };
  • 相关阅读:
    只有经历过,才知道苦痛的来源,而时间,将是唯一验证坚持是否值得的标准
    java返回值是list的时候获取list的参数类型
    spring4整合xfire1.2.6的问题解决
    基于tomcat插件的maven多模块工程热部署(附插件源码)
    新鲜出炉的jquery fileupload 插件
    WEB应用打成jar包全记录
    activiti5.14版本在线流程设计器的国际化中文支持
    activiti获取可回退的节点
    园子里的生活
    2022届我校高二下半期理科12题
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4628541.html
Copyright © 2011-2022 走看看