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

简介: 删除链表的倒数第N个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。



78517dcdf3514bfeb9c57b4a0eed1f64.png

输入:head = [1,2,3,4,5], n = 2

输出:[1,2,3,5]

示例 2:


输入:head = [1], n = 1

输出:[]

示例 3:


输入:head = [1,2], n = 1

输出:[1]


提示:


链表中结点的数目为 sz

1 <= sz <= 30

0 <= Node.val <= 100

1 <= n <= sz


进阶:你能尝试使用一趟扫描实现吗?


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list


思路:

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。


思路是这样的,但要注意一些细节。

分为如下几步:

  • 定义fast指针和slow指针,初始值为虚拟头结点,如图:


7d0cc89c62074dbaac82188c1641ad78.png


fast首先走n + 1步 ,为什么是n+1呢,因为只有这样同时移动的时候slow才能指向删除节点的上一个节点(方便做删除操作),如图:


45b19fc628b74d139d7d5d6b4f78ff47.png

fast和slow同时移动,直到fast指向末尾,如题:


038c0791957d4f439fe783c69ec99fa7.png

删除slow指向的下一个节点,如图:



3f964305e54c4dd6b7be9dd636858844.png



代码:

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;
        ListNode* slow = dummyHead;
        ListNode* fast = dummyHead;
        while(n-- && fast != NULL) {
            fast = fast->next;
        }
        fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点
        while (fast != NULL) {
            fast = fast->next;
            slow = slow->next;
        }
        slow->next = slow->next->next; 
        // ListNode *tmp = slow->next;  C++释放内存的逻辑
        // slow->next = tmp->next;
        // delete nth;
        return dummyHead->next;
    }
};


相关文章
|
2月前
|
存储 Python
链表中插入节点
链表中插入节点
|
1月前
|
算法
19.删除链表的倒数第N个结点
19.删除链表的倒数第N个结点
|
2月前
|
存储 Python
删除链表节点详解
删除链表节点详解
|
20天前
|
算法
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
【数据结构与算法 刷题系列】求带环链表的入环节点(图文详解)
|
2月前
|
存储 Python
链表中删除节点
链表中删除节点
|
1月前
24. 两两交换链表中的节点
24. 两两交换链表中的节点
|
1月前
|
存储
删除链表的节点
删除链表的节点
15 0
|
1月前
|
存储 SQL 算法
|
1月前
|
SQL 算法 数据挖掘
力扣题目 19:删除链表的倒数第N个节点 【python】
力扣题目 19:删除链表的倒数第N个节点 【python】
|
2月前
|
存储 C语言
C语言中处理动态数据类型链表节点冲突的技术探讨
C语言中处理动态数据类型链表节点冲突的技术探讨
28 0