Python中链表的删除倒数第n个节点的优化算法
一个简单的方法是遍历一遍链表,获取链表的长度,然后再找到倒数第n个节点进行删除。但是这种方法需要遍历两遍链表,时间复杂度为O(n),不够高效。
更优化的方法可以使用双指针,一个指针指向链表的第一个节点,一个指针指向第n个节点,然后同时向后移动两个指针,直到第n个指针指向链表的尾节点。此时第一个指针指向的就是倒数第n个节点。
代码演示如下:
class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def removeNthFromEnd(head: ListNode, n: int) -> ListNode: dummy = ListNode(0) dummy.next = head first = dummy second = dummy for i in range(n+1): second = second.next while second: first = first.next second = second.next first.next = first.next.next return dummy.next # 创建一个链表:1 -> 2 -> 3 -> 4 -> 5 head = ListNode(1) current = head for i in range(2, 6): node = ListNode(i) current.next = node current = node # 删除倒数第2个节点 head = removeNthFromEnd(head, 2) # 输出链表中的值 while head: print(head.val) head = head.next
输出结果为:
1 2 3 5
在这个例子中,我们首先创建了一个链表1 -> 2 -> 3 -> 4 -> 5,然后删除了倒数第2个节点。输出结果表明,删除操作成功,链表变为1 -> 2 -> 3 -> 5。
相关文章