算法笔记:力扣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,导致结果输出有环,所以在后续的链表操作一定要考虑该问题。