两两交换链表中的节点 leetcode24
递归 两个节点一递归
第一次即成功,泪目!!
go
// 每两个进行一次交换
func swapPairs(head *ListNode) *ListNode {
//每两个的第一个节点
var pre *ListNode
//递归结束条件,即当剩下的节点不满足两个时
if head == nil || head.Next == nil {
return head
}
//保留递归的子节点
cur := head.Next.Next
//交换本次的顺序
pre = head.Next
pre.Next = head
//1 2 3 4 -> 2 1 4 3
//第三个节点开始进行递归,且如果交换,指向的应该是交换过后的次序,即本来的第四个
pre.Next.Next = swapPairs(cur)
//将交换次序后的返回
return pre
}
迭代方法,虚拟头节点
go
// 使用迭代方法
// 不能操之过急,这里前面迭代完连接的应当还是未交换过的次序
func swapPairs(head *ListNode) *ListNode {
dummyHead := &ListNode{}
cur := dummyHead //用来保存当前位置
//赋予初始值
cur.Next = head
//结束条件,即后续节点不满足两个
for cur.Next != nil && cur.Next.Next != nil {
//要交换的两个节点记为node1和node2;下一次迭代的起始定义为next
//h* 1 2 3 4
node1 := cur.Next
node2 := cur.Next.Next
next := cur.Next.Next.Next
//交换步骤
cur.Next = node2
node2.Next = node1
node1.Next = next
//更改下次迭代的开始节点
cur = node1
}
//由于使用虚拟头节点,返回真实的链表
return dummyHead.Next
}