链表学习Leetcode刷题记录(9_21)

题目内容:删除链表的倒数第N个节点

  1. 我一开始的想法:先遍历整个链表,再用循环找到倒数第N个结点,但是链表基础不好,连循环都做不到,于是失败告终。
  2. 苦苦思索半天没有成果,只能打开题解,发现这道题有两种思路
  3. 第一种思路是找到整个链表的长度,然后根据List_length进行for循环,用cur删除后继节点,暴力简单,时间复杂度为O(n),但这种方法局限在只有知道整个链表长度才能进行删除操作,浪费时间太多。
  4. 第二种思路则是使用快慢指针,让快指针先遍历,遍历到第N个结点时开始对第二个指针遍历,这样两个指针之间相差的距离刚好为N个结点,快指针到达链表末尾时慢指针刚好到删除节点的前驱节点,这样再将慢指针的后继节点删除即可完成任务。时间复杂度为O(L),L为链表长度,空间复杂度为O(1)。
  5. 注意快慢指针while循环里最终first指针指向nullptr,所以for循环里i要从0开始。
  6. class Solution {
    public:
        ListNode* removeNthFromEnd(ListNode* head, int n) {
            ListNode* dummy = new ListNode(0, head);
            ListNode* first = head;
            ListNode* second = dummy;
            for (int i = 0; i < n; ++i) {
                first = first->next;
            }
            while (first) {
                first = first->next;
                second = second->next;
            }
            second->next = second->next->next;
            ListNode* ans = dummy->next;
            delete dummy;
            return ans;
        }
    };
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值