链表算法题:-链表拆分将链表按照下标索引拆分成奇数链表和偶数链表两个链表


前言

链表操作:最开始我也没弄懂,但是这个就是不断的debug这样才能找到更合适的结果。


本题牛网连接:牛网连接

一、代码:

链表类:

@Data
class Node {
    private int id;
    private Node nextNode;
}

构建链表

 public static Node build(int count, Node head) {

        Node current = head;

        for (int i = 1; i <= count - 1; i++) {
            Node next = new Node();
            next.setId(i);
            current.setNextNode(next);
            current = next;
        }
        return head;
    }

拆分链表方法

public static Map<String,Node> splitNode2(Node head) {
        if (head == null || head.getNextNode() == null) {
            return new HashMap();
        }
        // 奇数节点链表的头
        Node jishu = head;
        // 偶数节点链表的头
        Node ouShu = head.getNextNode();
        // 偶数节点链表的当前节点
        Node even = ouShu;
        // 循环直到有一个链表结束
         while (jishu.getNextNode() != null && even.getNextNode() != null) {
            // 设置奇数节点的下一个节点
            jishu.setNextNode(even.getNextNode());
            // 移动奇数节点指针
            jishu = even.getNextNode();
            // 设置偶数节点的下一个节点
            even.setNextNode(jishu.getNextNode());
            // 移动偶数节点指针
            even = jishu.getNextNode();
        }
        // 最后将偶数链表连接到奇数链表的尾部
        jishu.setNextNode(ouShu);
        // 如果原始链表有奇数个节点,需要将最后一个偶数节点的 next 设置为 null
        if (even.getNextNode() == null) {
            jishu.setNextNode(null);
        }

        // 两个链表现在已经分离
        System.out.println("Odd Nodes: " + head); // 奇数节点表头 head
        System.out.println("Even Nodes: " + ouShu); // 偶数节点表头 evenHead

        Map<String,Node> map = new HashMap();
        map.put("奇数",jishu);
        map.put("偶数",ouShu);
        return map; // 返回重排后的链表头(现在包含奇数节点,其后是偶数节点)
    }

Main 方法

public static void main(String[] args) {

        Node head = new Node();
        head.setId(0);
        Node build = build(10, head);
        Map<String, Node> stringNodeMap = splitNode2(build);
    }

总结

难点:拆分的时候需要注意对象的变化,最开始的时候我并不理解对象为啥最后head是返回值,后来梳理多次才能理解:原来是第一个节点,并不是什么固定的值
再就是指针的正确移动和对象正确的数据变化。

指针其实就是:动态变化的链表中的一个值。

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值