题目
给定一个链表,删除链表的倒数第 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
进阶:能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/SLwz0R
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
思路:利用双指针思想,删除倒数第n个结点,让其中一个指针提前走n步,另一个结点再从头开始进行next,当第一个扫描到底时,另一个刚好扫描到需要删除的前一个,删除后面的结点即可。
代码:
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(head.next==null&&n==1) return null;
ListNode i=head;
ListNode j=head;
for(int k=n;k>0;k--) {
j=j.next;
}
if(j!=null) {
while(j.next!=null) {
i=i.next;
j=j.next;
}
i.next=i.next.next;
}else {
head=head.next;
}
return head;
}
}
小tips:对于链表类问题,可以在表头添加一个空表头来避免头结点的特殊操作
添加了空表头代码如下,对比可看出代码更加简洁
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode newHead=new ListNode();
newHead.next=head;
ListNode i=newHead;
ListNode j=newHead;
for(int k=n;k>0;k--) {
j=j.next;
}
while(j.next!=null) {
i=i.next;
j=j.next;
}
i.next=i.next.next;
return newHead.next;
}
}