给定一个单链表 L **的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln - 1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln - 1 → L2 → Ln - 2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [1,4,2,3]
示例 2:
输入: head = [1,2,3,4,5]
输出: [1,5,2,4,3]
提示:
- 链表的长度范围为
[1, 5 * 10^4] 1 <= node.val <= 1000
学习灵神的基础算法
代码
用到了之前
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
def reorderList(self, head: Optional[ListNode]) -> None:
# 就是先把中间节点到末尾这一段反转,然后再先原链表再反转后的一个一个交叉连接起来
# 876. 链表的中间结点
def middleNode(head):
# 使用快慢指针,慢指针每次1步,快指针每次2步
# 如果奇数个节点,那么fast 到达最后1个节点时候,fast.next = None,slow正好在正中
# 如果偶数个节点,那么fast达到最后一个节点之后的位置,fast = none,slow正好在中间第二个节点
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow
# 206.反转链表
def reverseList(head) :
#借助三个指针pre、cur、nxt
pre = None
cur = head
while cur:
nxt = cur.next
cur.next = pre
pre = cur
cur = nxt
return pre
mid = middleNode(head)
head2 = reverseList(mid) # 第二段反转链表的头结点
while head2.next:
# 直到第二段没了,第二段等于或长一点
t1 = head.next # 记录2个head的下一个位置
t2 = head2.next
head2.next = head.next
head.next = head2
head = t1
head2 = t2