文章目录
19. 删除链表的倒数第N个节点
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
代码
经典的双指针法
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
//经典双指针法
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(0);//一个前置头结点做辅助,返回链表时去除
pre.next = head;
ListNode l = pre;
ListNode r = pre;
while(n != 0){//右指针先走n个结点距离
r = r.next;
n--;
}
while(r.next != null){//右指针r再走到尾结点,此时l走了len-(n-1)处(倒数n的前一个结点),两者加起来为len+1,加上pre的长度
r = r.next;
l = l.next;
}
l.next = l.next.next;//删除l后面的一个结点
return pre.next;
}
}