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

这道题还是关于链表操作的一道题,这道题也是相对简单的一道题,也算是自己重新温习了一遍链表的知识,当然,数据结构是编程的基础,这一块的内容需要反复打磨。接下来我们来看一下这道题。

 这道题我们采用两种方法来求解,本还有一种,但由于能力原因,随后再进行学习。

方法一:

我们先求出链表的长度,用长度来找到倒数第n个节点的值,随后,在通过删除节点的操作来完成算法。

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        
        int index = listLength(head)-n+1;
    
        if (index == 1)
            return head->next;
    
        for (int i = 1; i < index - 1; i++) {
            pre = pre->next;

        }
        //然后让前一个结点的next指向要删除节点的next
        pre->next = pre->next->next;
        return head;
    }

    //求链表的长度
    int listLength(ListNode* head) {
        int length = 0;
        while (head != nullptr)
        {
            length++;
            head = head->next;
        }
        return length;
    }
}

因为索引位是倒数第n位的下标,先通过循环慢慢寻找位置,然后在进行链表节点的操作。

方法二:

我们使用两个指针,此处为快慢指针来进行求解。

1、首先我们将头结点赋值给两个指针

2、将快指针先进行n步的移动

3、随后快指针与慢指针保持距离缓步前行

4、等到快指针到边界的时候停止移动

5、这个时候慢指针的下一个位置就是要删除的节点。

原理就是两个指针中间留有n的距离,等到快指针到边界的时候,正好可以得出倒数第n个节点的位置,在对其进行删除即可。

代码如下:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* fast=head;
        ListNode* slow=head;
        for(int i=0;i<n;i++){
            fast=fast->next;
        }
        if(fast==nullptr)
            return head->next;
        while(fast->next!=nullptr){
            fast=fast->next;
            slow=slow->next;

        }
        slow->next=slow->next->next;
        return head;
    }
};

总结:

本次题目略微简单,在数据结构与算法的课程中也基本都学过,但是奈何当时只是不牢固,现在做起来还是有些吃力。也算是对已学知识进行简要的复习!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值