给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
一次遍历法
由于我们要删除倒数第n个节点,所以我们设置两个快慢指针 tail 和 head,同时对链表进行遍历,并且 tail 比 head 超前 n 个节点。当 tail 遍历到链表的末尾时,head 就恰好处于倒数第 n 个节点。
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode tail=head; //快指针
ListNode root=head; //慢指针
int pace;
for (pace=0;pace<n&&tail!=null;pace++)
tail=tail.next;
if (pace<n) return null; //若当前链表长度不满足要求,即所给n无效时,返回null
if (tail==null) //当头节点为倒数第n个节点
return root.next;
while (tail.next!=null){
tail=tail.next;
head=head.next;
}
head.next=head.next.next;
return root;
}
时间复杂度:O(N) 其中 N是链表的长度。
空间复杂度:O(1)