单链表的特性(有一个头,最后一个为空,中间相互联系)
单链表的节点定义
//定义节点
class Node{
public int no; //节点属性
public String name; //节点属性
public int age; //节点属性
public Node next; //链表的尾部
public Node(int no, String name, int age) {
this.no = no;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
单链表的相关方法
//定义链表
class SingleLinkedList{
//定义头节点,并且固定不变
private Node headNode = new Node(0,"",20);
public Node getHeadNode() {
return headNode;
}
//只向末尾添加内容
public void addNode(Node node){
Node temp = headNode; //链表指针,临时变量
while(true){
if(temp.next == null){
break;
}
temp = temp.next;
}
temp.next = node;
}
//按序插入列表
public void addByOrder(Node node){
Node temp = headNode; //链表指针,临时变量
while(true){
if(temp.next == null){
break;
}if(temp.no == node.no){
System.out.println("已有相同节点");
break;
}if(temp.next.no > node.no){ //已找到插入点
break;
}
temp = temp.next;
}
node.next = temp.next;
temp.next = node;
}
//删除节点
public void remove(Node node){
Node temp = headNode; //链表指针,临时变量
Boolean flag = false;
while(true){
if(temp.next == null){
break;
}if(temp.next.no == node.no){ //删除的条件
flag = true;
break;
}
temp = temp.next;
} //找到删除的节点
if(flag) {
temp.next = temp.next.next; //跳过节点
}
}
//更新节点数据
public void update(Node node){
Node temp = headNode; //链表指针,临时变量
Boolean flag = false;
while(true){
if(temp.next == null){
break;
}if(temp.next.no == node.no){ //修改的条件
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
/*node.next = temp.next.next;
temp.next = node;*/
temp.name = node.name;
temp.age = node.age;
}
}
//计算链表长度
public static int getLength(Node node){
Node temp =node;
int length = 0;
while(true){
if(temp.next != null){
length++;
temp=temp.next;
}else {
break;
}
}
return length;
}
//使链表反向倒置
public void reserve(Node node){
if(node == null || node.next == null){ //不需要转置
return;
}
Node newHnode = new Node(0,"",20);
Node temp = node.next ;
Node next;
while (temp != null){
next = temp.next;
temp.next = newHnode.next;
newHnode.next = temp;
temp = next;
}
node.next = newHnode.next;
}
//合并两个有序列表
public Node mergeList(Node node1,Node node2){
if(node1.next == null || node2.next == null){
return node1 == null ? node2 : node1;
}
Node temp1 = node1;
Node temp2 =node2.next;
Node next;
while (true){
if(temp1.next == null && temp2 != null){
temp1.next =temp2;
break;
}
while (temp2!=null){
if(temp2.no < temp1.next.no){
next =temp2.next;
temp2.next=temp1.next;
temp1.next=temp2;
temp1 = temp1.next;
temp2 =next;
continue;
}else{
break;
}
}
temp1 = temp1.next;
}
System.out.println("ll");
return node1;
}
//显示List,只为了显示效果
public void show(){
Node temp = headNode;
while (temp.next != null){
System.out.println(temp.next);
temp = temp.next;
}
}
}
单链表测试
@Test
public void addNodeTest(){
Node node1 = new Node(1,"张三",22);
Node node2 = new Node(2,"李四",16);
Node node3 = new Node(3,"王五",21);
Node node4 = new Node(4,"老六",35);
SingleLinkedList sll = new SingleLinkedList();
sll.addNode(node1);
sll.addNode(node2);
sll.addNode(node3);
sll.addNode(node4);
sll.show();
System.out.println(sll.getLength(sll.getHeadNode()));
}
双链表的定义
双链表类似于单链表,只是多了一个前指针,查找时可以向前也可以向后
//定义节点
class Node{
public int no; //节点属性
public String name; //节点属性
public int age; //节点属性
public Node next; //节点的尾部
public Node next; //节点的头部
public Node(int no, String name, int age) {
this.no = no;
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
", name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
其他方法只需要在增删改的时候同时修改前后节点即可
三种链表的区别。