链表交叉点求解

简单描述,多条链表,找出他们的交叉点,注意,链表自身也可能交叉

算法:

step2:处理链表节点,将节点放入临时的List中,进入下一个节点,判断临时List与全局节点集合中是否存在该节点,如果是,则说明是循环链表,将节点加入到结果集中,然后跳出,否则,继续直到结束

step3:将临时List中所有节点,加入到全局节点集,跳转step2,知道所有链表处理完毕

step4:打印结果

Node.java

/** * */ /** * @author jie.xiang * */ public class Node { private String name; private Node nextNode; public Node(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Node getNextNode() { return nextNode; } public void setNextNode(Node nextNode) { this.nextNode = nextNode; } @Override public String toString() { // TODO Auto-generated method stub String str = name; if (nextNode != null) { str += "-->" + nextNode.getName(); } return str; } }

DataFactory.java

import java.util.ArrayList; import java.util.List; /** * */ /** * @author jie.xiang * */ public final class DataFactory { public static List<Node> createNodeList() { List<Node> list = new ArrayList<Node>(); Node node1 = new Node("1"); Node node2 = new Node("2"); Node node3 = new Node("3"); Node node4 = new Node("4"); Node node5 = new Node("5"); Node node6 = new Node("6"); Node node7 = new Node("7"); Node node8 = new Node("8"); Node node9 = new Node("9"); Node node10 = new Node("10"); Node node11 = new Node("11"); Node node12 = new Node("12"); Node node13 = new Node("13"); Node node14 = new Node("14"); node1.setNextNode(node2); node2.setNextNode(node3); node3.setNextNode(node4); node4.setNextNode(node5); node5.setNextNode(node3); list.add(node1); node6.setNextNode(node2); list.add(node6); node7.setNextNode(node8); node8.setNextNode(node9); node9.setNextNode(node5); list.add(node7); node10.setNextNode(node8); list.add(node10); node11.setNextNode(node12); list.add(node11); node13.setNextNode(node8); list.add(node13); node14.setNextNode(node3); list.add(node14); return list; } }

CrossNodeCounter.java

import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; /** * */ /** * @author jie.xiang * */ public class CrossNodeCounter { private Set<Node> nodes = new HashSet<Node>(); private Map<Node, Integer> result = new HashMap<Node, Integer>(); public void findCrossNodes(List<Node> list) { for (Node node : list) { findCrossNode(node); } } /** * 对当前的链表做出处理,找出该链表的交叉点以及将点放入到一个统一的集合表中保持 * * @param node */ public void findCrossNode(Node node) { List<Node> tempList = new ArrayList<Node>(); tempList.add(node); node = node.getNextNode(); while (node != null) { if (tempList.contains(node) || nodes.contains(node)) { // 处理循环链表的情况 addNode(node); break; } else { tempList.add(node); node = node.getNextNode(); } } addNodesToSet(tempList); } /** * 保存链表的点 * * @param tempList */ private void addNodesToSet(List<Node> tempList) { for (Node node : tempList) { nodes.add(node); } } private void addNode(Node node) { Integer value = result.get(node); if (value == null) { value = 2;// 既然是交叉点,默认有两条线 } else { value++; } result.put(node, value); } public void printlnResult() { Set<Node> keys = result.keySet(); for (Node node : keys) { System.out.println("(Name)" + node.getName() + ":" + result.get(node) + "Lines)"); } } public static void main(String[] args) { CrossNodeCounter counter = new CrossNodeCounter(); counter.findCrossNodes(DataFactory.createNodeList()); counter.printlnResult(); } }

数据图如下:

测试结果为:

(Name)2:2Lines)
(Name)3:3Lines)
(Name)8:3Lines)
(Name)5:2Lines)

心得,该问题主要是基于集合的使用,主要是搞清楚怎么存放节点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值