题目描述:(题目来源:19. 删除链表的倒数第 N 个结点)
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
这一题有个简单的方法就是快慢指针法(定位链表中的特定位置),快指针和慢指针最初都指向头节点。
一:先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。
二:如果不为null,就让快指针和慢指针都往后移动,当快指针的next为null的时候,慢指针正好指向倒数第n+1个结点。
三:我们只需要把此时慢指针的next指向慢指针的next的next就行了,最后把head返回。
四:只遍历了一遍链表时间复杂度为O(n),只定义了一些辅助参数空间复杂度为O(1)。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode first = head;
ListNode second = head;
//如果是个空链表,直接返回就行了
if(head == null){
return head;
}
while(n > 0){
first = first.next;
n--;
}
//先让快指针往后走n步,然后判断快指针是否为null,如果为null,证明这个n就是链表的长度,我们把第一个结点删除返回head.next就行了。
if(first == null){
return head.next;
}
while(first.next != null){
first = first.next;
second = second.next;
}
//删除结点操作
second.next = second.next.next;
return head;
}
}
该博客介绍了如何使用快慢指针法解决删除链表倒数第N个节点的问题。首先,让快指针前进N步,然后同时移动快慢指针,直到快指针到达链表尾部。此时,慢指针所指的就是倒数第N+1个节点,将其next指向next的next即可完成删除操作。这种方法在一次遍历中实现了问题的解决,具有O(n)的时间复杂度和O(1)的空间复杂度。
814

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



