LeetCode 24. 两两交换链表中的节点

题目链接: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   //递归的返回结果
}
posted @ 2023-05-06 15:03  小星code  阅读(56)  评论(0)    收藏  举报