返回
消除烦恼 - 链表去倒数第N节点的奥义
前端
2023-12-07 10:49:22
前奏:理解问题的核心
想象一下,我们有一条由节点连接而成的链表,就像一串珍珠项链,而我们要做的是从项链的末端摘掉第N颗珍珠。问题归根结底是要找到倒数第N个节点,然后将其从链表中删除。
第一乐章:定位倒数第N个节点
为了找到倒数第N个节点,我们可以使用两种方法:
-
单次遍历法 :从头结点开始遍历链表,并计数,当计数器达到N时,此时节点就是我们要找的节点。
-
双指针法 :使用两个指针,一个指向链表头结点,另一个指向链表尾结点。同时将两个指针都向前移动,直到第一个指针移动了N步。此时,第二个指针指向的就是倒数第N个节点。
第二乐章:从链表中删除节点
找到了倒数第N个节点后,我们需要将其从链表中删除。如果该节点是头结点或尾结点,则删除操作相对简单。否则,我们需要找到该节点的前一个节点,然后将前一个节点的next指针指向该节点的下一个节点。
终章:代码实操,步步为营
理论知识固然重要,但代码实操才是检验真理的唯一标准。我们来看看如何用代码实现上述算法:
def remove_nth_from_end(head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
# 单指针法
dummy = ListNode(0)
dummy.next = head
first = dummy
for _ in range(n):
first = first.next
second = dummy
while first.next:
first = first.next
second = second.next
second.next = second.next.next
return dummy.next
def remove_nth_from_end_2(head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
# 双指针法
fast = head
slow = head
for _ in range(n):
fast = fast.next
if not fast:
return head.next
while fast.next:
fast = fast.next
slow = slow.next
slow.next = slow.next.next
return head
尾声:代码解读,融会贯通
在上面的代码中,我们提供了两种方法来解决问题。单指针法通过计数器来找到倒数第N个节点,而双指针法则使用两个指针同时移动来实现。
删除节点的操作也很简单,如果该节点是头结点或尾结点,则直接删除即可。否则,我们需要找到该节点的前一个节点,然后将前一个节点的next指针指向该节点的下一个节点。
通过本文的学习,相信您已经对如何删除链表的倒数第N个节点有了更深入的理解。希望这些知识能够帮助您在编程的道路上更上一层楼!