原先有两个链表list1和list2,合并链表为list3(代码有些冗余,且有bug,不会改)
package com.atguigu.linkedlist;
/**
* @author Madison
* @version 1.0
*/
public class Exercise1 {
public static void main(String[] args) {
Node node_0 = new Node(0, "0");
Node node_1 = new Node(1, "1");
Node node_2 = new Node(2, "2");
Node node_3 = new Node(3, "3");
Node node_4 = new Node(4, "4");
Node node_5 = new Node(5, "5");
Node node_6 = new Node(6, "6");
Node node_7 = new Node(7, "7");
Node node_8 = new Node(8, "8");
SingleLinkedList_1 list1 = new SingleLinkedList_1();
SingleLinkedList_1 list2 = new SingleLinkedList_1();
list1.addByOrder(node_0);
list1.addByOrder(node_2);
list1.addByOrder(node_4);
list2.addByOrder(node_1);
list2.addByOrder(node_3);
list2.addByOrder(node_5);
System.out.println("list1");
list1.list();
System.out.println("list2");
list2.list();
SingleLinkedList_1 list3 = new SingleLinkedList_1();
list3.addIntoOneListByOrder(list1.getHead(), list2.getHead());
System.out.println("list3");
list3.list();
}
}
class SingleLinkedList_1 {
private Node head = new Node(0, "");
public Node getHead() {
return head;
}
public void addByOrder(Node node) {
Node cur = head;
boolean flag = false;
while (true) {
if (cur.next == null) {
break;
}
if (cur.next.no > node.no) {
break;
} else if (cur.next.no == node.no) {
flag = true;
break;
}
cur = cur.next;
}
if (flag) {
System.out.println("该节点已存在");
} else {
node.next = cur.next;
cur.next = node;
}
}
public void list() {
if (head.next == null) {
return;
}
Node cur = head.next;
while (true) {
System.out.println(cur);
cur = cur.next;
if (cur == null) {
break;
}
}
}
public void addIntoOneListByOrder(Node head1, Node head2) {
Node cur1 = head1;
Node cur2 = head2;
Node next1 = null;
Node next2 = null;
Node cur = getHead();
cur1 = cur1.next;
next1 = cur1.next;
cur2 = cur2.next;
next2 = cur2.next;
while (true) {
if (cur1 == null || cur2 == null) {
break;
}
if (cur1 != null && cur2 != null && cur1.no == cur2.no) {
cur.next = cur1;
cur = cur.next;
cur1 = next1;
cur2 = next2;
if (next1 != null) {
next1 = next1.next;
}
if (next2 != null) {
next2 = next2.next;
}
if (next1 == null && next2 == null) {
cur1 = null;
cur2 = null;
} else if (next1 == null && next2 != null) {
cur1 = null;
} else if (next1 != null && next2 == null) {
cur2 = null;
}
} else if (cur1 != null && cur2 != null && cur1.no > cur2.no) {
cur.next = cur2;
cur2 = next2;
cur = cur.next;
if (next2 != null) {
next2 = next2.next;
} else {
while (cur1 != null) {
cur.next = cur1;//
cur1 = next1;
cur = cur.next;
if (next1 != null) {
next1 = next1.next;
}
}
}
} else if (cur1 != null && cur2 != null && cur1.no < cur2.no) {
cur.next = cur1;
cur1 = next1;
cur = cur.next;
if (next1 != null) {
next1 = next1.next;
} else {
while (cur2 != null) {
cur.next = cur2;//
cur2 = next2;
cur = cur.next;
if (next2 != null) {
next2 = next2.next;
}
}
}
}
}
}
}
class Node {
public int no;
public String name;
public Node next;
public Node(int no, String name) {
this.no = no;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
'}';
}
}
如果数据是错落地加入链表,结果正常:
如果两个链表有相同元素,原链表list1和list2的数据和原先不一样,导致list3也不对:
例如像这样添加元素:
list1.addByOrder(node_0);
list1.addByOrder(node_1);
list1.addByOrder(node_4);
list1.addByOrder(node_5);
list1.addByOrder(node_6);
list1.addByOrder(node_8);
list2.addByOrder(node_0);
list2.addByOrder(node_2);
list2.addByOrder(node_3);
list2.addByOrder(node_5);
list2.addByOrder(node_7);
list2.addByOrder(node_8);
原先加入list1和list2不一样,现在完全一样了,猜测是因为添加的元素是引用类型的,所以导致list1和list2有相同元素加入时,最后产生了这样的效果(猜测的,不一定对)