leetcode-143

123 阅读1分钟

题目描述:具体描述见原题。简单来说就是按照一定规则重排链表。

解题思路:首先找到链表的中间节点,其次反转中点后半部分链表,最后按照规则重新插入节点。具体过程见代码。

具体代码:

func reorderList(head *ListNode)  {
 if head == nil || head.Next == nil {
		return 
	}

	l1 := head
	l2 := head
	for l2.Next != nil && l2.Next.Next != nil { // 找到链表中间节点
		l1 = l1.Next
		l2 = l2.Next.Next
	}

	middle := l1
	pre := l1.Next
	for pre.Next != nil { // 反转后半部分链表,后半部分指的是中间节点之后的所有节点
		current := pre.Next
		pre.Next = current.Next
		current.Next = middle.Next
		middle.Next = current
	}

	l1 = head
	l2 = middle.Next
	for l1 != middle { // 按照规则重新拼接,这一步可以拿笔画一下就掌握具体过程了
		middle.Next = l2.Next
		l2.Next = l1.Next
		l1.Next = l2
		l1 = l2.Next
		l2 = middle.Next
	}
	return 
}

补充说明:这道题可以看作乱炖了之前几道题中的一些技巧,链表中很多常用技巧都可以拿笔画一下就透透的了。(昨天开题答辩跑了一整天累屁了,今天划了一下午水才解出这道题,重排部分确实绕晕了好几次,不过导师竟然同意九月参加论文答辩了,真神奇嘿嘿嘿)