删除链表的倒数第N个节点
题目
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
分析
普通方法:双遍历
说明:常规思路是首先遍历一遍链表统计出链表的长度Len,通过(Len-n)计算出删除的节点;这个方法比较简单,但是需要遍历两遍。
进阶方法:单遍历
说明:单遍历是遍历一遍;但是需要开辟额外的空间,即双指针;先让front指针往前走n个节点,然后rear和front节点同时往前走,当front节点走完之后,rear指针走到倒数第N个节点;
注意:此处先开辟一个头结点pre指向head便于处理短链表的情况。
解法:双指针 0ms 36.5MB
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode pre = new ListNode(0);
pre.next = head;
ListNode rear = pre;
ListNode front = pre;
while (n-- > 0) {
front = front.next;
}
while (front != null && front.next != null) {
front = front.next;
rear = rear.next;
}
rear.next = rear.next.next;
return pre.next;
}