如何使用Python实现链表的删除链表的倒数第n个节点 II 操作
链表是由节点组成的数据结构,每个节点包含一个指向下一个节点的指针和一个值。
删除链表的倒数第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个节点。
相关文章