链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。
链表与数组之间的差别是:
(1)数组的元素个数是固定的,而组成链表的结点个数可按需要增减;
(2)数组元素的存诸单元在数组定义时分配,链表结点的存储单元在程序执行时动态向系统申请:
(3)数组中的元素顺序关系由元素在数组中的位置(即下标)确定,链表中的结点顺序关系由结点所包含的指针来体现。
(4)对于不是固定长度的列表,用可能最大长度的数组来描述,会浪费许多内存空间。
(5)对于元素的插人、删除操作非常频繁的列表处理场合,用数组表示列表也是不适宜的。若用链表实现,会使程序结构清晰,处理的方法也较为简便。
例如:在一个列表中间要插人一个新元素,如用数组表示列表,为完成插人工作,插人处之后的全部元素必须向后移动一个位置空出的位置用于存储新元素。
对于在一个列表中删除一个元素情况,为保持数组中元素相对位置连续递增,删除处之后的元素都得向前移一个位置。如用链表实现列表.链表结点的插人或删除操作不再需要移动结点,只需改变相关的结点中的后继结点指针的值即可,与结点的实际存储位置无关。
下面是链表的各种操作代码实现
package 链表学习;
class singleLinkedListDemo{
//定义一个头节点
private HeroNode head=new HeroNode(0,"");
//获取头节点的方法,因为上面私有成员不能直接使用
public HeroNode getHead() {
return head;
}
//添加节点
public void addNodelist(HeroNode heroNode) {
//因为head节点是不能动的,所有定义一个辅助节点
HeroNode temp=head;
while(true) {
if(temp.next==null) {
break;
}
temp=temp.next;
}
temp.next=heroNode;
}
//修改节点
public void upDataNode(int id,String name) {
HeroNode temp=head.next;
boolean flag=false;
if(temp==null) {
System.out.println("链表为空");
return;
}
while(true) {
if(temp.id==id) {
flag=true;
break;
}
if(temp.next==null) {
break;
}
temp=temp.next;
}
if(flag) {
temp.name=name;
}else {
System.out.println("没有找到id为"+id+"的节点");
}
}
//删除节点
public void delNode(int id) {
HeroNode temp=head;
boolean flag=false;
while(true) {
//已经遍历到最后需要退出循环
if(temp.next==null) {
break;
}
//找到需要删除的节点的前一个节点
if(temp.next.id==id) {
flag=true;
break;
}
temp=temp.next;
}
if(flag) {
temp.next=temp.next.next;
}else {
System.out.println("没有找到id为"+id+"的节点");
}
}
//显示链表
public void showLinklist(HeroNode head) {
if(head.next==null) {
System.out.println("链表为空");
return;
}
HeroNode temp=head.next;
while(true) {
if(temp==null) {
break;
}
System.out.println(temp);
temp=temp.next;
}
}
}
//创建链表节点的类
class HeroNode{
public int id;
public String name;
public HeroNode next;
public HeroNode(int id,String name) {
super();
this.id=id;
this.name=name;
}
@Override
public String toString() {
return "HeroNode [id=" + id + ", name=" + name + "]";
}
}
public class Linedlist {
public static void main(String[] args) {
singleLinkedListDemo singleLinkedListDemo=new singleLinkedListDemo();
HeroNode heroNode1=new HeroNode(1,"张三");
HeroNode heroNode2=new HeroNode(2,"李四");
HeroNode heroNode3=new HeroNode(3,"王五");
HeroNode heroNode4=new HeroNode(4,"小明");
HeroNode heroNode5=new HeroNode(5,"小红");
System.out.println("-------------添加节点-------------");
//添加节点
singleLinkedListDemo.addNodelist(heroNode1);
singleLinkedListDemo.addNodelist(heroNode2);
singleLinkedListDemo.addNodelist(heroNode3);
singleLinkedListDemo.addNodelist(heroNode4);
singleLinkedListDemo.addNodelist(heroNode5);
//显示节点
singleLinkedListDemo.showLinklist(singleLinkedListDemo.getHead());
System.out.println("-------------修改节点-------------");
//修改节点
singleLinkedListDemo.upDataNode(4,"小兰");
//显示节点
singleLinkedListDemo.showLinklist(singleLinkedListDemo.getHead());
//删除节点
System.out.println("-------------删除节点-------------");
singleLinkedListDemo.delNode(2);
//显示节点
singleLinkedListDemo.showLinklist(singleLinkedListDemo.getHead());
}
}