【Leetcode】328.奇偶链表

题目链接

328. 奇偶链表

题目描述

解题思路

暴力法

先统计链表长度,然后根据链表长度决定两两交换链表中的元素的次数即可。(如果不明白自己画个图即可)

拆分为奇偶链表在拼接

维护两个指针 odd 和 even 分别指向奇数节点和偶数节点,初始时 odd = head,even = evenHead。通过迭代的方式将奇数节点和偶数节点分离成两个链表,每一步首先更新奇数节点,然后更新偶数节点。最后把偶数节点拼接在奇数节点后面即可。

AC代码

解法一

/**
 * 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 oddEvenList(ListNode head) {
        if(head == null || head.next == null || head.next.next ==null) return head;
        ListNode countNode = head;
        int count = 0;
        while(countNode != null){
            count++;
            countNode = countNode.next;
        }
        //链表的经典解法,3指针!!!!!!
        ListNode dum = head;
        ListNode pre = head;
        ListNode cur = head.next;
        ListNode temp = cur.next;
        int tot = 0;
        //根据链表长度决定两两元素交换的次数
        if(count % 2 == 0) tot = count / 2 - 1;
        else tot = count / 2;
        while(tot > 0){
            int num = tot;
            while(num > 0){
                pre.next = temp;
                cur.next = temp.next;
                temp.next = cur;
                pre = cur;
                if(cur.next != null) cur = cur.next;
                if(cur.next != null) temp = cur.next;
                num--;
            }
            tot--;
            dum = dum.next;
            pre = dum;
            cur = pre.next;
            temp = cur.next;
        }
        return 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 oddEvenList(ListNode head) {
        if(head == null || head.next == null || head.next.next ==null) return head;
        ListNode odd = head;
        ListNode even = head.next;
        ListNode evenHead = even;
        while(true){
            odd.next = even.next;
            if(even.next != null) odd = even.next;
            else break;
            if(odd.next != null) even.next = odd.next;
            else break;
            if(odd.next != null) even = odd.next;
        }
        odd.next = evenHead;
        even.next = null;
        return head;
    }
}
posted @ 2020-11-13 09:48  控球强迫症  阅读(178)  评论(0编辑  收藏  举报