目录
题目描述:19. 删除链表的倒数第 N 个结点(中等)
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
LeetCode做题链接:LeetCode-删除链表的倒数第 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
进阶: 你能尝试使用一趟扫描实现吗?
题目接口
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
}
}
解题思路
-
1.本题采用双指针的思路,先让一个指针(后指针)移动到和第一个指针(前指针)相差n+1个元素(也就是中间相隔2个结点)
-
2.然后一起移动,如果移动到后指针为null,说明前指针的下一个结点就是要删除的倒数第n个元素
-
3.删除前指针的下一个结点即可
-
4.最后返回head的值,因为head一直在头部
-
5.注意:当n和链表长度一致的时候,说明要删的是第一个元素,直接返回head->next即可
注:上面的图片来自:程序员吴师兄
代码
java
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if (head == null) {
return null;
}
ListNode frontPointer = head;
ListNode backPointer = head;
while (n-- >= 0) {
// 判断后指针是否为空,为空停止
if (backPointer == null) {
// 指针为空,且n和链表长度一致,说明要删除的是第一个元素
if (n == -1) {
return head.next;
}
return null;
}
backPointer = backPointer.next;
}
while (true) {
// 后指针为空的时候,停止遍历,删除前指针的后一个结点
if (backPointer == null) {
frontPointer.next = frontPointer.next.next;
break;
}
// 两个指针遍历
frontPointer = frontPointer.next;
backPointer = backPointer.next;
}
return head;
}
}
成功!
PS:
感谢您的阅读!如果您觉得本篇文章对您有所帮助,请给予博主一个赞喔~