LeetCode 19. 删除链表的倒数第N个节点
大家好,我是灵魂画师--茄子。技术水平一般,喜欢画画。最近好忙,都没时间画画了,欠下的画我一定给大家补回来。
开始今天的正题。
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例 1:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
解法:
1.第一种解法
思路:
1. 先遍历一遍获取长度length。
2. 用长度length 减去 n 就是我们要到达的位置。
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
let removeNthFromEnd = function(head, n) {
let length = 0;
let dummy = new ListNode();
dummy.next = head;
let p = dummy;
while(p.next != null){
length++;
p = p.next;
}
p = dummy;
while(length - n > 0){
length --;
p = p.next;
}
p.next = p.next.next;
return dummy.next;
}
2.快慢指针解法
思路:
1. 设定一个快指针,一个慢指针。
2. 快指针先走,慢指针暂时停留在原地。
3. 当快指针前进了n个节点的时候,慢指针也开始前进。
4. 当快指针走完全程,慢指针就是我们要的节点。
/**
* @param {ListNode} head
* @param {number} n
* @return {ListNode}
*/
let removeNthFromEnd = function(head, n) {
let length = 0;
let dummy = new ListNode();
dummy.next = head;
let pre = cur = dummy;
while(cur.next != null){
if(n > 0){
n --;
cur = cur.next;
} else {
pre = pre.next;
cur = cur.next;
}
}
pre.next = pre.next.next;
return dummy.next;
}
结合我的分析你是不是对这道题有了更清晰的认识了呢?
以上就是我的思路以及解法了,希望大家喜欢我,我会继续努力的ヾ(◍°∇°◍)ノ゙。(点个赞把我带走吧~~)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。