算法笔记:力扣24. 两两交换链表中的节点

思路:

本题最简单的就是通过递归的形式去实现

复制代码
class Solution {
    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;
    }
}

对于链表的许多问题,如果不知道如何解决,那么可以无脑转成数组,然后直接操作数组,最后再转为链表。

本题的思路,可以将下标分为奇偶两个部分,将所有奇数下标的队列存放到奇数队列中,偶数同理,然后先从偶数队列中拿去节点,再从奇数节点拿取,以此重复直至两个队列都没有节点即可。

复制代码
class Solution {
    public ListNode swapPairs(ListNode head) {
            //交换链表节点 那么从头结点开始 就可以按照奇偶 将所有的节点分成两个部分  
            
        Deque<ListNode> jishu=new LinkedList<>(); //存放奇数位置的队列
        Deque<ListNode> oushu=new LinkedList<>(); //存放偶数位置的队列

        ListNode current=head;
        int flag=1; //奇偶数标记  //头结点从1开始计算
        while(current!=null){
            if(flag%2!=0){ //奇数
            jishu.addLast(current);
            }else{//偶数
            oushu.addLast(current);
            }
            flag++;
            current=current.next;
        }
        //那么新节点就先从偶数队列取然后再从奇数队列取 交替进行
        ListNode dummyNode=new ListNode(0); //虚拟头节点
        dummyNode.next=head;
     //   head=null;
        current=dummyNode;
        flag=2; //先从偶数队列拿 然后再从奇数队列拿
        while(!jishu.isEmpty()||!oushu.isEmpty()){
            if(flag%2!=0){//如果是奇数
                //如果奇数队列为空就从偶数队列拿
                if(jishu.isEmpty()){
                    ListNode temp=oushu.pollFirst();
                    temp.next=null;
                    current.next=temp;
                }else{
                    ListNode temp=jishu.pollFirst();
                    temp.next=null;
                    current.next=temp;
                }
              
            }else{

                if(oushu.isEmpty()){ //如果偶数队列为空 则取奇数队列拿
                ListNode temp=jishu.pollFirst();
                    temp.next=null;
                    current.next=temp;
                }else{
                    ListNode temp=oushu.pollFirst();
                    temp.next=null;
                    current.next=temp;
                }
             
            }
            flag++;
            current=current.next;
        }
      //  head=dummyNode;
        return dummyNode.next;
    }
}

注意,在移动链表的时候,要注意将移动的链表的next根据实际情况来处理,本题最初忘记将.next=null,导致结果输出有环,所以在后续的链表操作一定要考虑该问题。

相关推荐
小曹要微笑1 小时前
STM32H7系列全面解析:嵌入式性能的巅峰之作
c语言·stm32·单片机·嵌入式硬件·算法
寻星探路1 小时前
JavaSE重点总结后篇
java·开发语言·算法
松涛和鸣3 小时前
14、C 语言进阶:函数指针、typedef、二级指针、const 指针
c语言·开发语言·算法·排序算法·学习方法
yagamiraito_5 小时前
757. 设置交集大小至少为2 (leetcode每日一题)
算法·leetcode·go
星释5 小时前
Rust 练习册 57:阿特巴什密码与字符映射技术
服务器·算法·rust
无敌最俊朗@5 小时前
力扣hot100-141.环形链表
算法·leetcode·链表
WWZZ20258 小时前
快速上手大模型:深度学习10(卷积神经网络2、模型训练实践、批量归一化)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
moringlightyn8 小时前
Linux---进程状态
linux·运维·服务器·笔记·操作系统·c·进程状态
go_bai8 小时前
Linux-线程2
linux·c++·经验分享·笔记·学习方法
sali-tec9 小时前
C# 基于halcon的视觉工作流-章62 点云采样
开发语言·图像处理·人工智能·算法·计算机视觉