LC-19
19. 删除链表的倒数第 N 个结点
思路基本直接出来,双指针,IndexFast 和 IndexSlow 中间相隔 N - 1, 这样 IndexFast 到了最后,IndexSlow 自然就是倒数第 N 个结点。
Java实现
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy = new ListNode(0, head);
ListNode IndexFast = head;
ListNode IndexSlow = dummy;
for (int i = 0; i < n; i++) {
IndexFast = IndexFast.next;
}
while (IndexFast != null) {
IndexFast = IndexFast.next;
IndexSlow = IndexSlow.next;
}
IndexSlow.next = IndexSlow.next.next;
ListNode ans = dummy.next;
return ans;
}
}
Python实现
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode:
dummy = ListNode(0,head)
fast = head
slow = dummy
for i in range(n):
fast = fast.next
while fast != None:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return dummy.next
使用虚拟头节点的好处:
没有虚拟,需要判断头节点,并且处理头节点的代码逻辑与处理其它节点(非头节点)的代码逻辑特别相似,有方法使得代码更优美并且能避免对头节点的判断呢?
可以通过在头节点的前面增加虚拟头节点,这样头节点就跟其它节点一样了,
不需要单独拎出来考虑,
但是需要注意的是返回的时候,需要返回虚拟头节点的下一节点而不是虚拟头节点。