文档讲解:代码随想录(代码随想录)
完成状态: 待补全,临时笔记。
704.二分查找
题目链接
思路
代码
19. 删除链表的倒数第 N 个结点
两遍循环,第一次遍历链表长度,根据链表总长度和n计算的出倒数第n个结点对应的正向索引值(从0开始),第二次遍历用于删除计算的索引对应的链表元素。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int size = 0;
ListNode dummyNode = new ListNode(0, head);
ListNode cur = dummyNode;
while(cur.next != null){
size++; // 获取链表的总长度
cur = cur.next;
}
if(size == 0){
return dummyNode.next;
}
cur = dummyNode;
int index = size - n;
while(index > 0){
cur = cur.next; // 找到倒数第n个节点对应的正向的下标值(从0开始)的前一个结点
index--;
}
cur.next = cur.next.next;
return dummyNode.next;
}
}
双指针法:
删除倒数第n个节点的惯用思路(无论是数组还是链表):如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾(null),不是最后一个链表元素。此时删掉slow所指向的节点就可以了 。
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummyHead = new ListNode(0, head);
ListNode fast = dummyHead, slow = dummyHead;
n++; // fast走n+1步, slow才会指向倒数n+1个节点,即倒数第n个节点的前一个节点
while(n > 0 && fast != null){
fast = fast.next;
n--;
}
while(fast != null){
slow = slow.next;
fast = fast.next;
}
//此时 slow 的位置就是待删除元素的前一个位置
slow.next = slow.next.next;
return dummyHead.next;
}
}