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 };
  • 相关阅读:
    Linq 和 Lambda 查询中按照多个值进行分组GroupBy
    enter键触发事件的清除
    3、Python 基础类型 -- List 列表类型
    2、Python 基础类型 -- String 字符串类型
    1、Python 基础类型 -- Number 数字类型
    JMeter 常用网站
    性能测试之基础理论
    JMeter 性能测试实例
    JMeter 服务器监控插件环境配置
    【C++】利用指针实现通过函数改变多个参数的值
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4628541.html
Copyright © 2011-2022 走看看