题目描述:具体描述见原题。简单来说就是按照一定规则重排链表。
解题思路:首先找到链表的中间节点,其次反转中点后半部分链表,最后按照规则重新插入节点。具体过程见代码。
具体代码:
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
}
补充说明:这道题可以看作乱炖了之前几道题中的一些技巧,链表中很多常用技巧都可以拿笔画一下就透透的了。(昨天开题答辩跑了一整天累屁了,今天划了一下午水才解出这道题,重排部分确实绕晕了好几次,不过导师竟然同意九月参加论文答辩了,真神奇嘿嘿嘿)