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

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
这个算法可以通过直接遍历出链表的长度,再根据长度再次遍历删除第N个结点。
我这里主要用的是双指针算法,通过两个快慢节点遍历链表,
这个算法好处就是只遍历一次。

先让fast节点前进N个节点

slow每次都是在待删除的前一个节点, 所以要先让fast先走一步

让slow结点和fast节点同时走,每次走一步

当fast点走完时

slow的下一节点就是要删除第N个节点

代码如下:
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode fast = head;
ListNode slow = head;
//先让快指针走n步
while(n--!=0){
fast = fast.next;
}
//如果刚好走完,删除第一节点(返回第二个节点
)
if(fast==null){
return head.next;
}
//slow每次都是在待删除的前一个节点, 所以要先让fast先走一步
fast = fast.next;
//slow结点和fast节点同时走
while(fast!=null){
fast = fast.next;
slow = slow.next;
}
//删除节点的前一个节点
slow.next = slow.next.next;
return head;
}
这篇博客介绍了如何利用双指针算法有效地在链表中删除倒数第n个节点。首先让快指针先行n步,然后快慢指针同步移动,直到快指针到达末尾,此时慢指针指向的就是待删除节点的前一个位置,从而实现一次遍历完成删除操作。这种方法避免了多次遍历链表,提高了效率。
332

被折叠的 条评论
为什么被折叠?



