记录算法笔记(2025.5.10) 两两交换链表中的节点

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

示例 1:

输入:head = [1,2,3,4]

输出:[2,1,4,3]

示例 2:

输入:head = []

输出:[]

示例 3:

输入:head = [1]

输出:[1]

提示:

  • 链表中节点的数目在范围 [0, 100] 内
  • 0 <= Node.val <= 100

思路:

  1. 创建两个队列 queue1queue2,分别用于存储奇数位置的节点和偶数位置的节点。

  2. 遍历链表,将节点按照奇偶位置分别加入到两个队列中。

  3. 重新拼接链表,先从 queue2 中取出节点,再从 queue1 中取出节点,依次连接。

  4. 最后返回新链表的头节点。

代码:C#

public class Solution {

    public ListNode SwapPairs(ListNode head) {

        Queue<ListNode> queue1=new Queue<ListNode>();

        Queue<ListNode> queue2=new Queue<ListNode>();//创建两个队列

        int count=0;

        ListNode dummy=new ListNode(0,null);//虚拟节点

        ListNode ans=dummy;//后面要使用的节点

        while(head!=null)//遍历这个链表,将单数和偶数节点分别存到相应队列中

        {

   

            if(count%2==0)

            {

              queue1.Enqueue(head);

            }

            else

            {

                queue2.Enqueue(head);

            }

         head=head.next;

            count++;

        }

        while(queue1.Count>0||queue2.Count>0)//只要有一个队列还有节点

        {

            if(queue2.Count>0)

            {

               ListNode node=queue2.Dequeue();//创建一个新节点等于这个队列中的节点

               node.next=null;//然后让改节点的next为空,是为了防止成环,假设这个是1,存到队列中,取出来它的next还指向2,所以要做这一步断开1指向2

               ans.next=node;

               ans=ans.next;

            }

            if(queue1.Count>0)//同理

            {

               ListNode node=queue1.Dequeue();

               node.next=null;

              ans.next=node;

              ans=ans.next;

            }

        }

        return dummy.next;//返回虚拟节点后面一个就行

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值