题目描述
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。尝试使用一次扫描实现
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
输入:head = [1], n = 1
输出:[]
输入:head = [1,2], n = 1
输出:[1]
一、解题思路
针对这道题目,比较容易想到的是计算整个链表的长度,然后根据题目输入的n移动指针将对应节点删除,虽然这种算法的时间复杂度为 O ( N ) O(N) O(N),但是整个过程要遍历两次链表。一种只需要遍历一次链表的算法为双指针。尾指针和头指针之间间隔n-1个节点,这样当尾指针指向链表末尾时,头指针指向了待删除节点的前置节点,这样对头指针采取
头指针.next=头指针.next.next
当然还需要注意一些细节,比如 头指针.next为空,这样就不存在头指针.next.next,具体怎样避免,我们从代码中了解。
二、Java 实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode first=head;
ListNode second=head.next;
for (int i=0;i<n-1;i++){
if (second==null)
return head;
second=second.next;
}
if (second==null)
return head.next;
while (second.next!=null){//寻找删除节点的前位节点
second=second.next;
first=first.next;
}
first.next=first.next.next;
return head;
}
}