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

使用虚拟头节点的好处:

没有虚拟,需要判断头节点,并且处理头节点的代码逻辑与处理其它节点(非头节点)的代码逻辑特别相似,有方法使得代码更优美并且能避免对头节点的判断呢?

可以通过在头节点的前面增加虚拟头节点,这样头节点就跟其它节点一样了,

不需要单独拎出来考虑,

但是需要注意的是返回的时候,需要返回虚拟头节点的下一节点而不是虚拟头节点。

posted @ 2022-03-16 18:54  Ricardo_ML  阅读(32)  评论(1编辑  收藏  举报