1.核心思想
链表中只包含一个数据项,即对第一个链接点的引用。
2.实现链表
public class TestLinkList {
public static void main(String[] args) {
LinkList linkList=new LinkList();
linkList.insert(40);
linkList.insert(12);
linkList.insert(23);
linkList.insert(10);
linkList.displayAll(); //10 23 12 40
}
}
public class LinkList {
private Link first;
public void insert(long value){
Link lnk=new Link(value);
if(first==null){//链表为空,直接指向第一个链接点
first=lnk;
}
else{//链表不为空,新链接点指向以前的first点,再将链表的first指向它自己
lnk.setNext(first);
first=lnk;//链表引用的永远是最新插入的链接点
}
}
public void displayAll(){
Link current=first;
while(current!=null){//当链表为空,current.getNext()会报错
System.out.println(current.getData());//将当前点的数据取出来
current=current.getNext();//再指向下一个元素
}
}
}
3.查找指定节点
public static void main(String[] args) {
LinkList linkList=new LinkList();
linkList.insert(40);
linkList.insert(12);
linkList.insert(23);
linkList.insert(10);
linkList.displayAll(); //10 23 12 40
System.out.println("找到节点,数据为:"+linkList.find(10).getData());
//找到节点,数据为:10
}
//查找节点
public Link find(long key){
Link current=first;
while(current.getData()!=key){
if(current.getNext()==null){
//找完了所有结点,还没找到
return null;
}
current=current.getNext();
}
return current;
}
4.添加指定结点
public static void main(String[] args) {
LinkList linkList=new LinkList();
linkList.insert(40);
linkList.insert(12);
linkList.insert(23);
linkList.insert(10);
linkList.insert(20,1);
linkList.displayAll();//10 20 23 12 40
}
//添加结点到指定位置
public void insert(long value,int pos){
if (pos == 0) {
insert(value);
} else {
Link current = first;
for (int i = 0; i < pos - 1; i++) {
//注意:i < pos - 1
//当pos=1,因为first已经指向位置1,所以跳出for循环
current = current.getNext();
}
Link lnk = new Link(value);
lnk.setNext(current.getNext());//新结点指向原位置结点的next
current.setNext(lnk);//原位置结点的next设为自己
}
}
5.删除指定结点
public static void main(String[] args) {
LinkList linkList=new LinkList();
linkList.insert(40);
linkList.insert(12);
linkList.insert(23);
linkList.insert(10);
linkList.displayAll();//10 23 12 40
linkList.delete(10);
linkList.displayAll();//23 12 40
}
//删除指定结点
public void delete(long key){
Link current=first;
Link ago=first;//当前查找结点的上一个
while(current.getData()!=key){
if(current.getNext()==null){
//找完了链表,找不到,返回
return;
}else{
ago=current;
current=current.getNext();
}
}
if(current==first){
//没有进入while循环,第一个结点就是指定删除结点
first=first.getNext();
}else{
//当前结点是key,让它的前一个指向它的后一个
ago.setNext(current.getNext());
}
}
6.比较链表和顺序表
public static void main(String[] args) {
//构建链表
LinkList linkList=new LinkList();
Date date1=new Date();
for(int i=0;i<1000000;i++){
linkList.insert(i);
}
Date date2=new Date();
System.out.println(date2.getTime()-date1.getTime());
//每次都不一样,某次134ms
//构建顺序表
MyArray ma=new MyArray(1000001);
date1=new Date();
for(int i=0;i<1000000;i++){
ma.insert(i);
}
date2=new Date();
System.out.println(date2.getTime()-date1.getTime());
//20ms,但实际链表更快,只需改变指针的指向(此程序未实现)
date1=new Date();
linkList.delete(999999);
date2=new Date();
System.out.println(date2.getTime()-date1.getTime());
//0,实际上链表删除应更快
date1=new Date();
ma.delete(999999);
date2=new Date();
System.out.println(date2.getTime()-date1.getTime());
//11,删除后每一位要移动,非常麻烦
}
}
本文详细介绍了链表的基本操作,包括插入、查找、删除等,并通过示例代码展示了这些操作的具体实现过程。此外,还对比了链表与顺序表在不同操作上的效率差异。
183

被折叠的 条评论
为什么被折叠?



