题目描述:具体描述见原题。简单来说就是两两交换相邻节点,注意是节点而不仅仅是节点值。
解题思路:该题采用递归即可,交换节点部分采用反转链表思路。具体过程见代码注释。
具体代码:
func swapPairs(head *ListNode) *ListNode {
n := head
for i := 0; i < 2; i++ { // 循环结束后n为子问题头节点
if n == nil { // 递归结束条件
return head
}
n = n.Next
}
h := reverse(head, n) // 反转[head,n)之间节点,返回反转后的头节点
head.Next = swapPairs(n) // 递归简单理解:子问题已经解决完毕,子问题之外的节点在上一行代码执行结束后已经完成反转,此时head节点位于反转之后链表的尾部,那么很自然令head.Next = 子问题的头节点就可以了。
return h // 返回本次所有操作后头节点
}
func reverse(n1, n2 *ListNode) *ListNode { //反转链表,注意该方法不处理尾节点
p := n2
for n1 != n2{ // for循环中为反转链表常用思路四行代码,可以拿笔画一画就整透透的
temp := n1.Next
n1.Next = p
p = n1
n1 = temp
}
return p
}
补充说明:该题也有非递归思路,我好像不会,欢迎留言。该解题思路同样适合K个一组反转链表。