leetcode-328

156 阅读1分钟

题目描述:具体描述见原题。简单来说就是将一个链表内定义为“奇数节点”的节点排在“偶数节点”的前边,且奇数节点保持位置升序,偶数节点保持位置升序。

解题思路:该题可以初始化两个节点,一个作为奇数节点链表表头,一个作为偶数节点链表表头,然后遍历之后,将偶数节点链表插入到奇数链表之后。具体过程见代码。

具体代码:

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,朝毕业迈出坚实一步,希望能早点毕业。