快捷搜索: 王者荣耀 脱发

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;
    }
};

总结:

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

经验分享 程序员 微信小程序 职场和发展