拆分奇偶链表

108 阅读1分钟

拆分奇偶链表(前提条件,链表单调且连续,并且节点个数为偶数个)

拆分奇偶链表的过程必须在一次遍历链表的过程中完成;

原因是如果想先拆分奇数链表,再拆分偶数链表;在拆分奇数链表结束后,原链表的结构已经发生变化;所以在拆分偶数链表时无法使用之前的链表结构;

所以拆分奇偶链表的过程必须在一次遍历链表的过程中完成; 代码如下:

// 拆分奇偶链表(前提是保证链表升序,而且数值连续,比如:1,2,3,4,5,6,7,8)
 public static ListNode[] splitUpListNode(ListNode head){
        ListNode odd = head; // 奇数链表
        ListNode even =head.next; // 偶数链表
        ListNode tempOdd =odd;
        ListNode tempEven = even;
​
        while(tempEven !=null){
            // 偶数链表没有到达结尾位置
            if(tempEven.next !=null){
                // 让奇数链表节点指向偶数链表节点的下一个
                tempOdd.next=tempEven.next;
                // 奇数链表节点来到刚刚指向的节点位置
                tempOdd=tempOdd.next;
                // 偶数链表节点指向奇数链表节点的下一个位置
                tempEven.next=tempOdd.next;
                // 偶数链表节点来到刚刚指向的节点位置
                tempEven=tempEven.next;
            }else{ //偶数链表节点到达结尾位置
                tempOdd.next=null; // 让奇数链表指向null;
                tempEven.next=null; // 偶数链表指向null;
                break; // 退出循环
            }
        }
        return new ListNode[]{odd,even}; // 得到拆分后的奇偶链表
    }

结果如下:

image.png