在正文的第一句加入: 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
示例 1:
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]
提示:
链表中结点的数目为 sz 1 <= sz <= 30 0 <= Node.val <= 100 1 <= n <= sz
题解
1.使用快慢指针,快指针领先慢指针n个位置,因此当快指针到达链表尾部时,慢指针刚好到达倒数n+1节点,此时只要把慢指针的下一个节点变成下下个节点就可以了.
注意点:当数组是由一个的情况下,那么一定会移除唯一一个元素.因此在右指针移动阶段如果判断出当前元素为null(超过链表尾部),那么直接将该元素去除(return head.next)
public ListNode removeNthFromEnd(ListNode head, int n) {
// while 进行下一个节点是否存在循环
ListNode left = head;
ListNode right = head;
ListNode temp;
// 将右指针放到左指针的第n个位置
while (null != right) {
if (0 != n) {
right = right.next;
n --;
// 当在右指针单独移动当中遇到结尾(溢出的元素时链表倒数第一位)时,直接返回head.next
if (null == right) {
return head.next;
}
continue;
}
// 右指针找到链表结尾
if (null ==right.next) {
// 左指针直接跳过下一个节点,连接下下个节点
left.next = left.next.next;
break;
}
right = right.next;
left = left.next;
}
return head;
}