力扣 24. 两两交换链表中的结点

力扣 24. 两两交换链表中的结点

image.png

image.png

这道题很多细节需要注意。

老规矩,加上虚拟的头节点dummyhead,便于处理。考虑到如果结点数目是奇数,就不再处理最后一个结点,所以while循环里面判断条件就是cur.next!=null && cur.next.next!=null。

下图是移动next指针的示意图

image.png

虚拟头结点指向原来的head,在移动next指针域之前,保存cur.next和cur.next.next.next。

最后返回的是dummyhead.next,不能返回head,如果返回head,会把没有交换之前的头节点弄丢。

/**
 * Definition for singly-linked list.
 * 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; }
 * }
 */
class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head==null||head.next==null)return head;
        ListNode dummyhead=new ListNode(-1);
        dummyhead.next=head;
        ListNode cur=dummyhead, tmp=null, tmp1=null;
        while(cur.next!=null && cur.next.next!=null){
            tmp=cur.next;
            tmp1=cur.next.next.next;

            cur.next=cur.next.next; //第一步
            cur.next.next=tmp;      //第二步
            tmp.next=tmp1;          //第三步

            cur=tmp;
        }
        return dummyhead.next;
    }
}

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注