美文网首页
Leetcode 24 两两交换链表中的节点

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

作者: hekirakuno | 来源:发表于2019-11-01 15:05 被阅读0次

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

    示例:
    给定 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;
        }
    }
    

    相关文章

      网友评论

          本文标题:Leetcode 24 两两交换链表中的节点

          本文链接:https://www.haomeiwen.com/subject/mcnfbctx.html