剑指 Offer II 026. 重排链表
原始题目链接:https://leetcode-cn.com/problems/LGjMqU/
给定一个单链表 L 的头节点 head ,单链表 L 表示为:
L0 → L1 → … → Ln-1 → Ln
请将其重新排列后变为:
L0 → Ln → L1 → Ln-1 → L2 → Ln-2 → …
不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
解题思路:
单链表不能随机读取,所以将节点都放在一个线性表中,然后再修改指针的指向。
代码实现:
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reorderList(self, head: ListNode) -> None:
"""
Do not return anything, modify head in-place instead.
"""
if not head:
return
vec = []
node = head
# 把单链表的节点都放在线性表中
while node:
vec.append(node)
node = node.next
# 重排线性表的next指针,符合题意的要求
# 线性表可以通过索引随机读取,所以定义一头一尾的指针
i, j = 0, len(vec) - 1
while i < j:
vec[i].next = vec[j]
i += 1
if i == j:
break
vec[j].next = vec[i]
j -= 1
vec[i].next = None
参考文献:
https://leetcode-cn.com/problems/LGjMqU/solution/zhong-pai-lian-biao-by-leetcode-solution-wm25/