目录:
目的
1->2->3->4->5->6->NULL 重排后为 1->3->5->2->4->6->NULL
思路
这个任务是将原链表的奇数下标全部排在偶数下标前面。这个操作很像两个top中学争夺生源,为了公平最后通过奇偶排名来分配(在我以前的高中就是这样)。 把所有学生的中考成绩排名重新排列,奇数排名排在前面给第一家学校,偶数排在后面给第二家学校,学生信息保持不变。
学校准备:
- 奇才学府校长
odd
,从名单的第1个学生(head)开始负责奇数名次的分配。 - 偶秀学院校长
even
,从名单的第2个学生(head.next)开始负责偶数名次的分配。 - 为了方便最终排列,偶秀学院的校长还专门记下了自己第一个学生的名字(
even_head
)。
分配学生:两位校长交替工作:
- 奇才学府校长:负责奇数名次的学生,把当前奇数名次的学生直接跳过偶数名词找到下一个奇数名次的学生odd.next = even.next并记录该学生odd = odd.next。
- 偶秀学院校长:同理,负责偶数名次的学生,把当前偶数名次的学生直接指向下一个偶数名次的学生even.next = odd.next并记录该学生even = even.next。
- 两位校长交替处理,直到偶数校长发现自己没有更多学生可分配(到达名单末尾)。
重组名单:奇数组接在偶数组前面:
- 两位校长工作完成后,奇数名次学生和偶数名次学生都已经排好。
- 奇才学府校长将自己的最后一名学生,指向 偶秀学院的第一名学生(
even_head
),完成整合odd.next = even_head。 - 名单重新排列完毕,校长将重排后的名单交给教育部return head。
复杂度
-
时间复杂度:O(n)
- 每个学生被访问一次,所有操作都是线性的。总复杂度是 O(n),其中 n 是学生人数。
-
空间复杂度:O(1)
- 只用了两位校长(两个指针)和一个记录 (
even_head
),没有额外开辟空间,复杂度为 O(1)。
- 只用了两位校长(两个指针)和一个记录 (
记忆秘诀
- 分校:奇数排名的归奇才学府,偶数排名的归偶秀学院。
- 整队:奇数队排在前,偶数队接在后,保证顺序不乱。
python代码
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param head ListNode类
# @return ListNode类
#
class Solution:
def oddEvenList(self, head: ListNode) -> ListNode:
if not head or not head.next:
return head # 链表为空或只有一个节点,直接返回
odd = head # 奇数位节点
even = head.next # 偶数位节点
even_head = even # 保存偶数链表的头节点
while even and even.next:
odd.next = even.next # 奇数节点连接下一个奇数节点
odd = odd.next # odd 指针前进
even.next = odd.next # 偶数节点连接下一个偶数节点
even = even.next # even 指针前进
odd.next = even_head # 将奇数节点链表的尾部与偶数节点链表的头部相连
return head # 返回重排后的链表
* 欢迎大家探讨新思路,能够更好的理解和记忆