给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]
内 0 <= Node.val <= 100
思路:
-
创建两个队列
queue1
和queue2
,分别用于存储奇数位置的节点和偶数位置的节点。 -
遍历链表,将节点按照奇偶位置分别加入到两个队列中。
-
重新拼接链表,先从
queue2
中取出节点,再从queue1
中取出节点,依次连接。 -
最后返回新链表的头节点。
代码: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;//返回虚拟节点后面一个就行
}
}