题目
给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
输入: head = [1,2,3,4,5]
输出: [1,3,5,2,4]
输入: head = [2,1,3,5,6,4,7]
输出: [2,3,6,7,1,5,4]
思路
定义4个指针
2个指针负责偶数节点链表
2个指针负责奇数节点链表
其中,1个指针负责定位各自的头节点,1个指针负责移动修改各自的其他节点的next指向
最后将修改好的奇数节点链表的尾 和 偶数节点链表的头连接起来
def oddEvenList(self, head: ListNode) -> ListNode:
if head==None or head.next==None:
return head
# 奇数节点移动指针
odd = head
# 奇数节点头指针
oddHead = head
# 偶数节点移动指针
even = head.next
# 偶数节点头指针
evenHead = head.next
# 当奇数移动指针,为None,或者它的next指向None,意味着遍历结束
# 为什么是根据奇数移动指针来判断的?
# 因为题目规定,链表的第一个节点是奇数节点
# 那么整个链表的奇数节点个数,一定是要么等于偶数节点个数,要么比偶数节点多1个
# 即 奇-偶-奇 或者 奇-偶-奇-偶
# 所以要选择较多的那一个作为判断循环结束的条件
# 如果选择偶数的话,奇-偶-奇,第一次循环 奇-偶 第二次循环 奇-None,就出错了
while even and even.next:
# 奇偶奇,奇和奇链接
odd.next = even.next
# 移动odd指针到下一个奇数节点上
odd = odd.next
# 偶奇偶,偶和偶链接
even.next = odd.next
# 移动even指针到下一个偶数节点上
even = even.next
# 奇数尾节点 和 偶数头节点 相连接
odd.next = evenHead
return oddHead
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。