码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 19. 删除链表的倒数第N个节点

时间:2020-02-19 21:16:05      阅读:98      评论:0      收藏:0      [点我收藏+]

标签:++   leetcode   code   cpp   remove   删除   开始   mat   ret   

题意

删除链表的倒数第\(n\)个结点,返回链表的头结点。

思路

  • 想法1:一趟扫描确定表长,第二趟删除第len - n个元素。时间复杂度:\(O(n)\)
  • 想法2:题目中问能否尝试使用一次扫描实现,思考一下。用两个指针就可以了,当前面的指针指向第\(n\)个元素时,后面的指针开始移动,这样他俩之间始终差\(n\)个元素,前面的指针指向最后的位置时,后面的指针正好指向倒数第\(n\)个元素。

代码

  • 代码1:
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {

        int len = 0;
        ListNode *t = head;
        while(t != NULL)    { ++len; t = t -> next; }

        ListNode res(0);
        res.next = head;
        t = &res;

        for(int i = 0; i < len - n; ++i)
            t = t -> next;

        t -> next = t -> next -> next;
        return res.next;
    }
};
  • 代码2:
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {

        ListNode res(0);
        res.next = head;
        ListNode *fast = &res, *slow = &res;

        while(fast -> next)
        {
            if(n)
                --n;
            else
                slow = slow -> next;
            fast = fast -> next;
        }

        slow -> next = slow -> next -> next;
        return res.next;
    }
};

总结

好多“思维”题都要用到双指针的思想呢。

LeetCode 19. 删除链表的倒数第N个节点

标签:++   leetcode   code   cpp   remove   删除   开始   mat   ret   

原文地址:https://www.cnblogs.com/songjy11611/p/12332913.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!