题目链接:LeetCode 24. 两两交换链表中的节点
本题不涉及算法,直接模拟就可以了,但是模拟的过程中,最好进行画图演示,不然容易出错。
想要达到两两交换链表中节点的效果,就需要按照以下三个步骤进行。
同时为了将头结点和非头结点统一处理,因此新建一个虚拟头结点,
初始时,cur指向虚拟头结点,然后进行如下三步:
操作之后,链表如下:
按照上面的步骤顺序,一步一步进行模拟即可。
完整代码如下:
func swapPairs(head *ListNode) *ListNode {
// 本题不涉及算法,直接模拟就可以了,但是模拟的过程中,最好进行画图演示,不然容易出错。
dumpy:=&ListNode{} //创建虚拟头结点,方便将头节点和非头结点统一处理。
dumpy.Next = head
curr:=dumpy //初始时,curr指向虚拟头结点
for curr != nil && curr.Next != nil && curr.Next.Next !=nil{
one:=curr.Next //对应图中的1号结点
curr.Next = curr.Next.Next
th:=curr.Next.Next //对应图中的3号结点
curr.Next.Next = one
one.Next = th
curr = curr.Next.Next
}
return dumpy.Next
}
另外本题也可以用递归实现,相对迭代稍微难理解一些。
代码如下:
// 递归三部曲
func swapPairs(head *ListNode) *ListNode {
//递归的退出条件
if head == nil || head.Next == nil {
return head
}
next := head.Next //对应图中的2号结点
head.Next = swapPairs(next.Next) //当前头结点的next是递归下一层的返回结果
//单层递归的逻辑,
next.Next = head
return next //递归的返回结果
}
标签:24,结点,curr,head,Next,链表,ListNode,LeetCode
From: https://www.cnblogs.com/lxing-go/p/17377379.html