328.奇偶链表

90 阅读1分钟

题目:
给定单链表的头节点 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

}