题目:
给定单链表的头节点 head ,将所有索引为奇数的节点和索引为偶数的节点分别组合在一起,然后返回重新排序的列表。
第一个节点的索引被认为是 奇数 , 第二个节点的索引为 偶数 ,以此类推。
请注意,偶数组和奇数组内部的相对顺序应该与输入时保持一致。
你必须在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题。
算法:
一定要考虑边界条件,节点个数为0,为1的场景
func oddEvenList(head *ListNode) *ListNode {
if head == nil {
return nil
}
// heade节点时奇数
oddStart, oddEnd := head, head
evenStart, evenEnd := head.Next, head.Next
var cur *ListNode
if evenEnd != nil {
cur = evenEnd.Next
}
count := 1
for cur != nil {
if count % 2 == 1 {
oddEnd.Next = cur
oddEnd = oddEnd.Next
} else {
evenEnd.Next = cur
evenEnd = evenEnd.Next
}
cur = cur.Next
count ++
}
// 只有一个节点的情况
if evenEnd != nil{
// ...6-》7 ,如果不设置6->nil 会形成环
evenEnd.Next = nil
}
oddEnd.Next = evenStart
return oddStart
}