java数据结构与算法刷题-----LeetCode328. 奇偶链表

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

java数据结构与算法刷题-----LeetCode328. 奇偶链表_第1张图片

解题思路

将链表按奇偶顺序,分成两个链表。最后将偶数链表放在奇数链表后面,下图中,even表示偶数下标,odd表示奇数下标,evenhead表示奇数链表的头结点
java数据结构与算法刷题-----LeetCode328. 奇偶链表_第2张图片
java数据结构与算法刷题-----LeetCode328. 奇偶链表_第3张图片
java数据结构与算法刷题-----LeetCode328. 奇偶链表_第4张图片
java数据结构与算法刷题-----LeetCode328. 奇偶链表_第5张图片

代码:时间复杂度O(n) 空间复杂度O(1):因为上面图解中的代码量少,但是比较难以理解,所以我会给出两个版本的代码,第一个代码量少,第二个更容易理解,但是两种版本效率是完全一样的。
  1. 代码量少的
    java数据结构与算法刷题-----LeetCode328. 奇偶链表_第6张图片
/**
 * 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) return head;
        ListNode odd = head;//指向奇数下标的头结点,并充当遍历结点
        ListNode evenHead = head.next; //指向偶数下标的头结点
        ListNode even = headB;//even表示偶数结点
        while(even!=null&&even.next!=null){//如果有结点可以遍历
            odd.next = even.next;//even指向偶数结点,那么它的下一个必然是奇数结点。放入奇数链表
            odd = odd.next;//奇数链表指针odd后移,那么odd的下一个就是偶数结点了
            even.next = odd.next;//让odd后面这个偶数结点,加入到偶数链even中
            even = even.next;//even后移,再次到偶数结点
        }
        odd.next = evenHead;//将偶数头结点,放到奇数链表末尾
        return head;//返回重新排列的链表
    }
}
  1. 代码量大的,但更容易理解。
    java数据结构与算法刷题-----LeetCode328. 奇偶链表_第7张图片
class Solution {
    public ListNode oddEvenList(ListNode head) {
        if(head == null || head.next == null) return head;
        ListNode headA = head;//headA表示奇数链表头结点
        ListNode headB = head.next; //headB表示偶数链表头结点
        ListNode current = headB.next;//current表示下一个该遍历的结点
        ListNode currentA = headA,currentB = headB;//currentA和currentB是奇偶两个链表的遍历指针
        boolean flag = true;//flag = true表示当前结点应该插入到奇数链表
        while(current!=null){//如果有结点可遍历
            currentA.next = null;currentB.next = null;//防止环的存在
            if(flag==true){//放headA中,表示奇数下标
                currentA.next = current;//插入到奇数链表尾部
                currentA = currentA.next;//奇数链表指针后移
                flag = false;//下一次插入偶数链表
            }else{
                currentB.next = current;
                currentB = currentB.next;
                flag = true;
            }
            current = current.next;//原链表指针后移
        }
        currentA.next = headB;//最后将偶数链表插入到奇数链表后面
        return headA;//返回新链表
    }
}

你可能感兴趣的:(算法,java,链表,算法,leetcode)