给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
题解:
- 双指针法:left + n = right
- 当right.next指向链表的末尾的时候,left.next就是倒数第N个结点
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
//双指针法:left + n = right
ListNode list = new ListNode(-1);
list.next = head;
ListNode left = list;//从list结点开始,防止出现倒数第n个结点是head的情况
ListNode right = list;
while(n-->0){
right = right.next;
}
//left = right-n
while(right.next!=null){
right = right.next;
left = left.next;
}
left.next = left.next.next;//list.next为倒数第n个结点
return list.next;
}
}