题目描述:具体描述见原题。简单来说就是将一个链表内定义为“奇数节点”的节点排在“偶数节点”的前边,且奇数节点保持位置升序,偶数节点保持位置升序。
解题思路:该题可以初始化两个节点,一个作为奇数节点链表表头,一个作为偶数节点链表表头,然后遍历之后,将偶数节点链表插入到奇数链表之后。具体过程见代码。
具体代码:
func oddEvenList(head *ListNode) *ListNode {
if head == nil || head.Next == nil {
return head
}
odd, even := &ListNode{Val:0, Next:nil}, &ListNode{Val:0, Next:nil} // 初始化奇偶链表
oddH, evenH := odd, even
tag := 0
for head != nil {
tag++
if tag % 2 == 0 { // 如果是偶数节点
even.Next = head // 更新偶数节点链表
even = even.Next
} else { // 如果是奇数节点
odd.Next = head // 更新奇数节点链表
odd = odd.Next
}
head = head.Next
}
even.Next = nil
odd.Next = evenH.Next
return oddH.Next
}
如果不愿意使用tag变量的话可以参考如下方式
func oddEvenList(head *ListNode) *ListNode {
if head == nil {
return nil
}
oddE := head // 初始化奇数链表尾指针
evenH, evenE := head.Next, head.Next // 初始化偶数链表头指针和尾指针
for evenE != nil && evenE.Next != nil {
oddE.Next = evenE.Next // 更新奇数链表
oddE = oddE.Next // 更新奇数链表尾指针
evenE.Next = oddE.Next // 更新偶数链表
evenE = evenE.Next // 更新偶数链表尾指针
oddE.Next = evenH //奇数链表尾部下一个节点永远指向偶数链表头节点
}
return head
}
补充说明:明天开题答辩hhhh,朝毕业迈出坚实一步,希望能早点毕业。