给定一个单链表 L 1 →L 2 →⋯→L n−1 →L n ,请编写程序将链表重新排列为 L n →L 1 →L n−1 →L 2 →⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。
时间: 2023-11-18 07:53:32 浏览: 153
好的,这是一个比较经典的链表问题。我们可以先将链表分成两部分,前半部分和后半部分,然后将后半部分翻转,最后将两个部分合并即可。
具体的步骤如下:
1. 使用快慢指针找到链表的中间节点,将链表分成前半部分和后半部分。
2. 将后半部分翻转。
3. 将前半部分和翻转后的后半部分交替合并。
代码实现如下:
```python
class ListNode:
def __init__(self, x):
self.val = x
self.next = None
def reorderList(head: ListNode) -> None:
if not head or not head.next:
return
# 找到链表的中间节点
slow, fast = head, head
while fast.next and fast.next.next:
slow = slow.next
fast = fast.next.next
# 将链表分成前半部分和后半部分
head1, head2 = head, slow.next
slow.next = None
# 将后半部分翻转
prev, curr = None, head2
while curr:
next_node = curr.next
curr.next = prev
prev = curr
curr = next_node
# 将前半部分和翻转后的后半部分交替合并
p1, p2 = head1, prev
while p2:
next_node1, next_node2 = p1.next, p2.next
p1.next = p2
p2.next = next_node1
p1, p2 = next_node1, next_node2
```
阅读全文