19.删除链表的倒数第N个节点
这道题是leecode hot100的第19题
难度: 中等
题目: 给你一个链表,删除链表的倒数第 n **个结点,并且返回链表的头结点。
思路分析:
链表题,有点儿意思,是寻找倒数的第N个结点,因为链表的长度是不确定的
我们可以使用双指针,先让快指针走N步,这样就可以找到应被删结点的前一个节点
让快慢指针同时走, 直到快指针走到节点末尾
这时慢指针指的就是被删结点的前一个节点
题解语言: js
题解:
var removeNthFromEnd = function (head, n) {
//虚拟头节点,常规操作,方便后续操作
const dummy = new ListNode(0);
dummy.next = head;
// 快慢指针
// 先让一快指针先走n步
let fast = dummy;
let slow = dummy;
//先让快指针先走n步
for(let i = 0; i <= n; i++){
fast = fast.next;
}
//两个指针同时走,直到快指针走到末尾
while(fast !== null){
fast = fast.next;
slow = slow.next;
}
// 删除节点
slow.next = slow.next.next;
return dummy.next;
};
其实我一开始想的是先翻转
翻转过来之后的倒数第N个结点就变成了第N个结点
让我删除第n个节点就可以
但是不好解决一些边界问题,比如链表只有一个节点时
这样虽然可行吧,但是不太优雅,不如快慢指针,而且需要翻转两次每次反转都相当遍历一次链表,复杂度太高
加油