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

news/2025/2/23 5:49:25
java">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;
    }

}


http://www.niftyadmin.cn/n/751604.html

相关文章

CI(持续集成)、CD(持续部署)

CI&#xff1a;持续分支合并、编译打包、单元测试、功能测试 CD&#xff1a;持续部署生产环境 https://zhuanlan.zhihu.com/p/381514438

ElasticSearch小结

ES集群分主从节点。 主节点是ID最大的节点。 默认每个索引对应5个主分片&#xff0c;每个主分片有一个副本分片。副本分片可以提高搜索的吞吐量&#xff0c;可以用于故障转移。 主从节点上都可以有主分片。有主分片不能正常工作&#xff0c;集群状态是red。有主分片对应的副…

Since Maven 3.8.1 http repositories are blocked.

私有仓库地址是http协议的&#xff0c;Maven3.8.1不支持&#xff0c;可以把私有仓库地址改成https协议&#xff0c;如果不支持https协议&#xff0c;可以把Maven版本降低&#xff0c;如3.6.3。在https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/下载解压apache-…

MySQL根据备注查询表、字段

MySQL的INFORMATION_SCHEMA库中有存储表、列等信息的表&#xff1a;TABLES、COLUMNS等。 在数据模型文档遗漏、过时、错误时&#xff0c;可以根据建表时表、列的备注找到表、字段。 SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_COMMENT like “%名称%” SELECT TA…

MySQL查询字段匹配某个规则的记录

select * from test_table where (name regexp ‘Z([0-9]{6})’) 1 查询test_table表中name字段是Z6位数字的记录 由若干个字母、数字、下划线和中划线组成&#xff1a; [a-zA-Z0-9_-] 正则表达式&#xff1a;https://blog.csdn.net/sinat_34626741/article/details/1238832…

钉钉报警工具

建立一个群&#xff0c;群内的成员可以添加机器人&#xff0c;群管理员可以修改群内的所有机器人。机器人有对应的Webhook&#xff0c;向这个地址发送信息&#xff0c;可以显示在群内。安全设置方向有信息内含有自定义关键词、地址加入验签信息、限制发送的IP地址段三种方式。 …

Java 代码解析 maven pom.xml 文件

<dependency><groupId>org.apache.maven</groupId><artifactId>maven-model</artifactId><version>3.6.0</version> </dependency>//pom 为 pom.xml 路径 FileInputStream fis new FileInputStream(new File(pom)) MavenXpp3…

Spring全局异常

Spring全局异常&#xff1a;https://blog.csdn.net/tolode/article/details/103263528、https://blog.csdn.net/lkforce/article/details/98494922