如何使用Python实现链表的删除链表的倒数第n个节点 II 操作

2023-04-11 00:00:00 节点 链表 如何使用

链表是由节点组成的数据结构,每个节点包含一个指向下一个节点的指针和一个值。

删除链表的倒数第n个节点 II操作需要知道链表的长度,常规的做法是通过遍历一次链表来获取长度,然后再遍历一次链表找到需要删除的节点。

但是这种做法需要遍历链表两次,效率不高。我们可以使用双指针的技巧进行优化。

具体来说,我们可以定义两个指针,一个快指针和一个慢指针。

快指针先向前移动n步,然后慢指针和快指针同时向前移动,当快指针到达链表末尾时,慢指针指向的就是需要删除的节点。

然后我们再定义一个哑节点dummy,将其指向头节点,这样就可以处理删除头节点的情况。

下面是使用Python实现删除链表的倒数第n个节点 II操作的代码演示:

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)
        slow, fast = dummy, dummy
        for i in range(n):
            fast = fast.next
        while fast.next:
            slow = slow.next
            fast = fast.next
        slow.next = slow.next.next
        return dummy.next

# test
node1 = ListNode(1)
node2 = ListNode(2)
node3 = ListNode(3)
node4 = ListNode(4)
node5 = ListNode(5)
node1.next = node2
node2.next = node3
node3.next = node4
node4.next = node5

solution = Solution()
new_head = solution.removeNthFromEnd(node1, 2)
while new_head:
    print(new_head.val, end=' ')
    new_head = new_head.next
# Output: 1 2 3 5

在以上示例中,我们使用了双指针的技巧,将快指针先向前移动n步,然后慢指针和快指针同时向前移动。

当快指针到达链表末尾时,慢指针指向的就是需要删除的节点。我们再将其删除即可。

最后再输出剩余节点的值,可以看到结果为1,2,3,5,即已经成功删除倒数第2个节点。

相关文章