leetcode-24

139 阅读1分钟

题目描述:具体描述见原题。简单来说就是两两交换相邻节点,注意是节点而不仅仅是节点值。

解题思路:该题采用递归即可,交换节点部分采用反转链表思路。具体过程见代码注释。

具体代码:

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个一组反转链表。