首页 > 编程语言 >Swap Nodes in Pairs

Swap Nodes in Pairs

时间:2023-06-11 13:44:05浏览次数:33  
标签:Pairs ListNode head next Swap curr Nodes null 节点

Source

Problem
Given a linked list, swap every two adjacent nodes and return its head.

Example
Given 1->2->3->4, you should return the list as 2->1->4->3.

Challenge
Your algorithm should use only constant space. You may not modify the valuesin the list, only nodes itself can be changed.

题解1 - Iteration

直觉上我们能想到的是使用 dummy 处理不定头节点,但是由于这里是交换奇偶位置的链表节点,我们不妨首先使用伪代码来表示。大致可以分为如下几个步骤:

  1. 保存2.next
  2. 将2.next赋值为1
  3. 将1.next赋值为步骤1中保存的2.next
  4. 将前一个链表节点的 next 指向2
  5. 更新前一个链表节点为1
  6. 更新当前的链表节点为步骤1中保存的2.next

链表类题目看似容易,但要做到 bug-free 其实不容易,建议结合图像辅助分析,onsite 时不要急,把过程先用伪代码写出来。然后将伪代码逐行转化。

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    /**
     * @param head a ListNode
     * @return a ListNode
     */
    public ListNode swapPairs(ListNode head) {
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy, curr = head;

        while (curr != null && curr.next != null) {
            ListNode after = curr.next;
            ListNode nextCurr = after.next;
            after.next = curr;
            curr.next = nextCurr;
            // link new node after prev
            prev.next = after;
            // update prev and curr
            prev = curr;
            curr = nextCurr;
        }

        return dummy.next;
    }
}

源码分析

这里使用 dummy 处理不定头节点,首先将 prev 初始化为 dummy,然后按照题解中的几个步骤逐步转化,需要注意的是 while 循环中 curr 和 curr.next 都不能为 null.

复杂度分析

遍历链表一遍,时间复杂度 O(1). 使用了若干临时链表节点引用对象,空间复杂度 O(1).

 

题解2 - Recursion

在题解1 的分析过程中我们发现比较难处理的是 prev和下一个头的连接,要是能直接得到链表后面新的头节点该有多好啊。首先我们可以肯定的是若head == null || head.next == null时应直接返回,如果不是则求得交换奇偶节点后的下一个头节点并链接到之前的奇数个节点。这种思想使用递归实现起来非常优雅!

Java

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    /**
     * @param head a ListNode
     * @return a ListNode
     */
    public ListNode swapPairs(ListNode head) {
        if (head == null || head.next == null) return head;

        ListNode after = head.next;
        head.next = swapPairs(after.next);
        after.next = head;

        return after;
    }
}

源码分析

这个递归实现非常优雅,需要注意的是递归步的退出条件(head == null || head.next == null)

复杂度分析

每个节点最多被遍历若干次,时间复杂度 O(n), 空间复杂度 O(1).

 

标签:Pairs,ListNode,head,next,Swap,curr,Nodes,null,节点
From: https://www.cnblogs.com/lyc94620/p/17472859.html

相关文章

  • 基于LVM方式创建的swap分区的缩减记录
    场景:关于Linux系统下,需要将swap分区的大小由128GB,缩减调整到32GB(swap分区是一个LVM格式的分区)操作系统:RedHatEnterpriseLinuxServerrelease7.9(Maipo) 1、先看一下现状,当前系统是有占用swap分区的:[root@qq-5201351~]#free-mtotalused......
  • D. The BOSS Can Count Pairs
    D.TheBOSSCanCountPairsYouaregiventwoarrays$a$and$b$,bothoflength$n$.Yourtaskistocountthenumberofpairsofintegers$(i,j)$suchthat$1\leqi<j\leqn$and$a_i\cdota_j=b_i+b_j$.InputEachtestcontainsmultipletest......
  • docker evel=error msg="error reading the kernel parameter net.ipv4.vs.expire_nod
    我使用的是dockerswarm-#报错evel=errormsg="errorreadingthekernelparameternet.ipv4.vs.expire_nodest_conn"error="open/proc/sys/net/ipv4/vs/expire_nodest_conn:nosuchfileordirectory"-#查看是否开启ip_vslsmod|grepip_vs==============......
  • 推断题(D - The BOSS Can Count Pairs)
    D-TheBOSSCanCountPairs#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;#defineendl"\n"//数学题关注边界条件和推断其他的值枚举算答案//nlogn做法//https://zhuanlan.zhihu.com/p/633006114//--------------------------------------------......
  • linux永久禁用交换分区swap
    Linux中永久禁用交换分区原创 入门小站 入门小站 2023-05-2821:47 发表于湖北收录于合集#Linux790个入门小站分享运维技巧及10k+Stars的开源项目252篇原创内容公众号【Linux250个常用命令速查手册】关注【入门小站】,后台回复「1001」自取。......
  • Problem E: 编写函数:Swap (I) (Append Code)
    ProblemE:编写函数:Swap(I)(AppendCode)TimeLimit:1Sec  MemoryLimit:16MBSubmit:7937  Solved:5693[Submit][Status][WebBoard]Description编写用来交换两个数的函数,使得“AppendCode”中的main()函数能正确运行。---------------------------......
  • UniswapV3金融公式计算
    概念unCollectFees未提取奖励CollectFees已提取奖励IL无偿损失公式NetAssets净资产每个pool的两个币的amount(数量)*price(单价)的累加值,但不包含奖励IL无偿损失开仓时的币数量价格-当前的币的数量价格=无偿损失(就是币价波动带来的资产的差异)APR收益率=(已......
  • linux 新增swap交换空间
    关闭所有交换分区命令如下:swapoff-a通过swap分区文件增加swap空间创建swap分区的文件ddif=/dev/zeroof=swapfilebs=1Mcount=1024其中bs是每块的大小,count是块的数量;bscount,就是swap文件的大小:这里1M1024=1G。可以根据需要自行调整。此外,swapfile是swap文件的路径,可......
  • AtCoder Beginner Contest 234 Ex Enumerate Pairs
    洛谷传送门AtCoder传送门把每个点分到\((\left\lfloor\frac{x}{K}\right\rfloor,\left\lfloor\frac{y}{K}\right\rfloor)\)的正方形内,枚举相邻正方形,计入答案。正确性显然。复杂度证明就是所有每个正方形内距离为\(K\)的点对下界为\(\Omega(n^2)\)。考虑分成四个边长为......
  • C++如何实现容器的Copy/Move/Swap方法
    C++如何实现容器的Copy/Move/Swap方法1、引言目前网上有很多关于如何编写C++容器的教程,比如各种“手写STL”之类的文章和视频,但是这些教程中的容器一般都不包括allocator,比如:template<typenameT>classMyVector{...};然而我们知道标准库的容器都是有一个Allocator的模......