奇数节点升序、偶数节点降序,得到整体升序的链表

import java.util.ArrayList;
import java.util.List;

/**
 * 奇数节点升序、偶数节点降序,得到整体升序的链表
 */
public class OddEvenLink {

    private static class Node {
        int value = -1;

        Node next = null;

        public Node(){
        }

        public Node(int value){
            this.value = value;
        }
    }

    public static void main(String[] args) {
        OddEvenLink oddEvenLink = new OddEvenLink();
        // 升序
        int[] oddNodeValues = {1, 6, 10, 60};
        // 降序
        int[] evenNodeValues = {100, 11, 5, 4};
        // 构建原始链表
        Node oldHeadNode = oddEvenLink.getOldLink(oddNodeValues, evenNodeValues);
        // 处理原始链表,得到新链表
        Node newHeadNode = oddEvenLink.getNewLink(oldHeadNode);
        // 遍历新链表
        oddEvenLink.searchNewLink(newHeadNode);
    }

    public Node getOldLink(int[] oddNodeValues, int[] evenNodeValues){
        int i = 0;
        int j = 0;
        Node dummyHeadNode = new Node();
        Node currentNode = dummyHeadNode;
        boolean isCurrentOdd = true;
        while(i < oddNodeValues.length || j < evenNodeValues.length){
            Node node;
            if(isCurrentOdd){
                node = new Node(oddNodeValues[i++]);
            } else {
                node = new Node(evenNodeValues[j++]);
            }

            currentNode.next = node;
            currentNode = node;
            isCurrentOdd = !isCurrentOdd;
        }

        return dummyHeadNode.next;
    }

    public Node getNewLink(Node oldHeadNode){
        // 分离奇数和偶数链表
        List<Node> oddHeadNoeAndEvenHeadNode = getOddLinkAndEvenLink(oldHeadNode);
        Node oldOddHeadNode = oddHeadNoeAndEvenHeadNode.get(0);
        Node oldEvenHeadNode = oddHeadNoeAndEvenHeadNode.get(1);
        // 反转偶数链表
        Node newEvenHeadNode = getNewEvenLink(oldEvenHeadNode);
        // 合并奇数链表和新的偶数链表
        return getNewLink(oldOddHeadNode, newEvenHeadNode);
    }

    public void searchNewLink(Node newHeadNode){
        Node currentNode = newHeadNode;
        while(currentNode != null){
            System.out.println(currentNode.value);
            currentNode = currentNode.next;
        }
    }

    private Node getNewLink(Node oldOddHeadNode, Node newEvenHeadNode){
        Node currentOddNode = oldOddHeadNode;
        Node currentEvenNode = newEvenHeadNode;
        Node dummyNewHeadNode = new Node();
        Node currentNewNode = dummyNewHeadNode;
        while(currentOddNode != null && currentEvenNode != null){
            if(currentOddNode.value <= currentEvenNode.value){
                currentNewNode.next = currentOddNode;
                currentOddNode = currentOddNode.next;
            } else {
                currentNewNode.next = currentEvenNode;
                currentEvenNode = currentEvenNode.next;
            }

            currentNewNode = currentNewNode.next;
        }

        if(currentOddNode == null && currentEvenNode == null){
            return dummyNewHeadNode.next;
        }

        if(currentOddNode != null){
            currentNewNode.next = currentOddNode;
        }

        if(currentEvenNode != null){
            currentNewNode.next = currentEvenNode;
        }

        return dummyNewHeadNode.next;
    }

    private Node getNewEvenLink(Node oldEvenHeadNode){
        Node currentNode = oldEvenHeadNode;
        Node currentPreNode = null;
        while(currentNode != null){
            Node currentNextNode = currentNode.next;
            currentNode.next = currentPreNode;
            currentPreNode = currentNode;
            currentNode = currentNextNode;
        }

        return currentPreNode;
    }

    private List<Node> getOddLinkAndEvenLink(Node oldHeadNode){
        // 奇数伪节点
        Node dummyOddHeadNode = new Node();
        Node currentOddNode = dummyOddHeadNode;
        // 偶数伪节点
        Node dummyEvenHeadNode = new Node();
        Node currentEvenNode = dummyEvenHeadNode;
        Node currentNode = oldHeadNode;
        boolean isCurrentOdd = true;
        while(currentNode != null){
            if(isCurrentOdd){
                currentOddNode.next = currentNode;
                currentOddNode = currentOddNode.next;
            } else {
                currentEvenNode.next = currentNode;
                currentEvenNode = currentEvenNode.next;
            }

            currentNode = currentNode.next;
            isCurrentOdd = !isCurrentOdd;
        }

        currentOddNode.next = null;
        currentEvenNode.next = null;

        List<Node> nodes = new ArrayList<>();
        nodes.add(dummyOddHeadNode.next);
        nodes.add(dummyEvenHeadNode.next);
        return nodes;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风铃峰顶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值