两两交换链表中的节点__leetcode

leetcode地址
两两交换链表中的节点
使用两种方法,迭代递归
这是使用的节点类

 public class ListNode {
    int val;
     ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }

迭代

判断是否满足条件,这里的条件设置为链表的个数是否为偶数,判断方法为利用当前节点和下一节点是否都不为null,都不为null表明,本次循环为成对出现

时间复杂度:O(n)
原因分析:这里n代表的是节点数量,每次的更新操作都与节点数量有关。

空间复杂度:O(1)
原因分析:这里只是用了少数变量用于中间存储,故为O(1)。

这是代码

    public ListNode swapPairs(ListNode head) {
    	//利用哑节点
        ListNode dummyHead = new ListNode(-1);
        //利用动态节点
        ListNode prev = dummyHead;
        //这里用于判断是否为节点对
        while(head != null && head.next != null){
       		//这里使用简单的思路整理,首先prev的下一节点
       		//指向head的下一节点
       		//同时更新prev为prev的next
            prev.next = head.next;
            prev = prev.next;
            //然后继续更新prev的下一节点,这里的方法更新
            //head的下一节点为prev的next(这里原节点的关系被断开)		
            //更新prev 的next为head
            head.next = prev.next;
            prev.next = head;
            //最后更新prev和head
            prev = prev.next;
            head = head.next;
        }
        //这里判断是否当前head节点之后存在next节点
        //若成对则不会跳出while循环
        //故需要将最后的节点进行连接然后返回dummyhead的next即可
        prev.next = head == null ? null : head;
        return dummyHead.next;
    }

递归

时间复杂度:O(n)
空间复杂度:O(n)
思路还是对于中间一个小节进行考虑,剩下的内容让他们自己递归就好,这里一定要写清楚递归结束的条件,当每次交换的节点对为null或者节点对只有一个节点另一个为null时,不需要交换,迭代结束

    public ListNode swapPairs(ListNode head) {
        //迭代
        if (head == null || head.next == null)
            return head;
        //定义返回的节点
        ListNode next = head.next;
        //递归交换剩余的节点
        head.next = swapPairs(next.next);
        //返回的节点指向其前置节点
        next.next = head;
        return next;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值