在链表操作中,"重排链表" 是一个常见的问题,其目标是将链表中的节点重新排列成
这样的顺序:链表的前半部分包含原始链表中的前 n/2 个节点(其中 n 是链表中的节
点总数),链表的后半部分包含剩下的 n/2 个节点,并且后半部分的节点顺序反转,
最后前半部分和后半部分节点交替连接。
为了解决这个问题,我们可以采用以下几个步骤:
1. 找到链表的中点:使用快慢指针法来找到链表的中点。快指针每次移动两步,慢指针
每次移动一步,当快指针到达链表末尾时,慢指针就位于链表的中点。
2. 反转链表的后半部分:从链表的中点开始,将链表的后半部分反转。这可以通过改变
节点的 next 指针的指向来实现。
3. 合并两个链表:现在你有两个链表:原始链表的前半部分和反转后的后半部分。你可
以通过交替地从这两个链表中取出节点来合并它们,形成一个新的链表。
下面是一个用 Python 实现的示例代码:
python 复制代码
class ListNode:
def
__init__(self,
val=0,
next=None):
self.val = val
self.next = next
def
reorderList(head:
ListNode) ->
None:
"""
Do not return
anything, modify
head in-place
instead.
"""
if not head or
not head.next or
not
head.next.next:
return
# Step 1: Find
the middle of the
list
slow, fast =
head, head.next
while fast and
fast.next:
slow = slow.next
fast =
fast.next.next
# Step 2: Reverse
the second half
of the list
prev, curr =
None, slow.next
slow.next = None
# Separate the
first and second
halves
while curr:
next_temp =
curr.next
curr.next = prev
prev = curr
curr = next_temp
# Step 3: Merge
the two halves
p1, p2 = head,
prev
while p2:
p1_next = p1.next
p2_next = p2.next
p1.next = p2
if p1_next:
p2.next = p1_next
p1 = p1_next
p2 = p2_next
# Helper function
to print the list
def
printList(node):
while node:
print(node.val,
end=" -> ")
node = node.next
print("None")
# Example usage
if __name__ ==