链表概述
链表是有序的列表,但是它在内存中是存储如下
小结:
链表是以节点的方式来存储,是链式存储
每个节点包含 data 域, next 域:指向下一个节点.
如图:发现链表的各个节点不一定是连续存储.
链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
- 单链表(带头结点) 逻辑结构示意图如下
链表增删改查
创建一个链表,实现添加人物信息等操作
package com.m.demo4;
public class Node {
public int id;
public String name;
public Node next;
public Node(int id, String name) {
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Node [id=" + id + ", name=" + name + "]";
}
}
package com.m.demo4;
public class singleLinkedList {
// 创建一个头节点
Node head=new Node(0,"");
// add方法:找到链表尾部,添加节点
public void add(Node newNode) {
// head不能移动,需要一个移动变量来代替
Node temp=head;
while(true) {
if(head.next==null) {
break;
}
if(temp.next==null) {//指向为空,就是找到最后一个节点
break;
}
temp=temp.next;
}
temp.next=newNode;
}
// show来遍历输出
public void show() {
Node temp=head;
while(true) {
if(head.next==null) {
System.out.println("链表是空的");
break;
}
if(temp.next==null) {
break;
}
temp=temp.next;
System.out.println(temp);
}
}
// del删除节点(通过id删除节点)
public void del(int id) {
Node temp=head;
boolean flag=false;//判断是否找到节点
while(true) {
if(head.next==null) {
System.out.println("链表为空");
break;
}
if(temp.next==null) {
break;
}
if(temp.next.id==id) {
flag=true;
break;
}
temp=temp.next;
}
temp.next=temp.next.next;
}
// 插入操作insert 按照id的大小插入,如果已经存在id就不插入
public void insert(Node newNode) {
Node temp=head;
boolean flag=false;//判断是否存在id
boolean last=false;//判断节点是否只能连在最后
while(true) {
if(head.next==null) {
// System.out.println("链表为空");
last=true;
break;
}
if(temp.next==null) {
last=true;
break;
}
if(temp.next.id==newNode.id) {
flag=true;
break;
}
if(temp.next.id>newNode.id) {
break;
}
temp=temp.next;
}
if(last) {
temp.next=newNode;
}else {
if(flag) {
System.out.printf("id=%d已经存在,不能再添加了\n",newNode.id);
}else {
newNode.next=temp.next;
temp.next=newNode;
}
}
}
// update 根据id 修改node的值
public void update(Node newNode) {
Node temp=head;
boolean flag=false;
while(true) {
if(head.next==null) {
System.out.println("链表为空");
break;
}
if(temp.next==null) {
break;
}
if(temp.next.id==newNode.id) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.next.name=newNode.name;
}else {
System.out.println("id不存在");
}
}
}
package com.m.demo4;
public class Test {
public static void main(String[] args) {
singleLinkedList linkedlist=new singleLinkedList();
Node n1=new Node(1,"小A");
Node n2=new Node(2,"小B");
Node n3=new Node(3,"小C");
linkedlist.add(n1);
linkedlist.add(n2);
linkedlist.add(n3);
linkedlist.show();
// System.out.println("删除后");
// linkedlist.del(1);
// linkedlist.show();
// linkedlist.del(2);
// linkedlist.show();
// linkedlist.del(3);
// linkedlist.show();
// System.out.println("插入操作");
// Node n4=new Node(4,"小D");
// linkedlist.insert(n4);
// linkedlist.insert(n2);
// linkedlist.insert(n1);
// linkedlist.show();
System.out.println("修改操作");
Node n=new Node(2,"小b");
linkedlist.update(n);
linkedlist.show();
}
}