本文共 1229 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要删除链表中的倒数第n个节点,并返回修改后的链表的头结点。为了实现这一点,我们可以使用一种高效的方法,仅使用一次遍历链表。
思路:double-pointer Technique
我们使用一个叫做双指针的方法,具体步骤如下:
这种方法实现了一次遍历,时间复杂度为O(n),空间复杂度为O(1),非常高效且节省内存。
代码实现
class Solution: def removeNthFromEnd(self, head: ListNode, n: int) -> ListNode: # 哨兵结点作为头的前驱节点 sentinel = ListNode(0, head) first = sentinel second = sentinel # 移动指针到n的位置 for _ in range(n): first = first.next second = second.next # 修改第二个指针的下一个节点,使其跳过n个节点 second.next = second.next.next # 返回新的头结点,即哨兵节点的下一个结点 return sentinel.next
详细步骤解释
哨兵结点创建:我们首先在链表的头部添加一个哨兵结点(dummy),this helps处理头结点的删除情况。
指针初始化:创建两个指针first和second,第一个指针指向哨兵结点,第二个指针指向哨兵结点的下一个结点(即原链表的头结点)。
移动指针:同时移动first和second指针n次。这样,当我们移动到正确的位置时,first将指向第n+1个结点,而second将正确指向所需删除结点的前驱节点。
删除节点:修改second指针,将其下一个结点指向second的下一个下一个结点,从而跳过实际要删除的结点。
返回新的头:返回哨兵结点的下一个结点,即为修改后的链表头结点。
这种方法确保了我们只需要一次遍历,能够高效地删除链表的倒数第n个节点。
转载地址:http://jnusz.baihongyu.com/