Leetcode 24 两两交换链表中的节点

2019-11-01  本文已影响0人  hekirakuno

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.

思路:把链表按照奇偶位置拆成两条,如题就是拆成1->3和2->4,然后偶奇顺序,重新拼接。

class Solution {
    public ListNode swapPairs(ListNode head) {
         //先按照位置的奇偶拆分成两条链表,再重新合并
        boolean odd = true;
        if(head==null||head.next==null){
            return head;
        }
        //奇数链表
        ListNode oddPre = new ListNode(-1);
        //偶数链表
        ListNode evenPre = new ListNode(0);
        ListNode oddCurr = oddPre;
        ListNode evenCurr = evenPre;
        ListNode curr = head;
        while(curr!=null){
            if(odd){
                oddCurr.next = curr;
                oddCurr = oddCurr.next;
                odd = false;
            }else {
                evenCurr.next = curr;
                evenCurr = evenCurr.next;
                odd = true;
            }
            curr = curr.next;
        }
        //去掉最后位置上多余的尾巴
        if(odd==false){
            evenCurr.next = null;
        }else {
            oddCurr.next = null;
        }
        odd = false;
        ListNode pre = new ListNode(0);
        ListNode ansCurr = pre;
        //重新拼接
        while(oddPre.next!=null&&evenPre.next!=null){
            if(odd){
                ListNode temp = new ListNode(oddPre.next.val);
                ansCurr.next = temp;
                oddPre = oddPre.next;
                odd = false;
            }else {
                ListNode temp = new ListNode(evenPre.next.val);
                ansCurr.next = temp;
                evenPre = evenPre.next;
                odd = true;
            }
            ansCurr = ansCurr.next;
        }
        if(oddPre.next==null){
            ansCurr.next = evenPre.next;
        }
        if(evenPre.next==null){
            ansCurr.next = oddPre.next;
        }
        return pre.next;
    }
}
上一篇下一篇

猜你喜欢

热点阅读