前言
链表操作:最开始我也没弄懂,但是这个就是不断的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是返回值,后来梳理多次才能理解:原来是第一个节点,并不是什么固定的值
再就是指针的正确移动和对象正确的数据变化。
指针其实就是:动态变化的链表中的一个值。