《数据结构与算法》学习笔记15 有序链表和双向链表

本文详细介绍了一种有序链表的实现方式及其操作方法,包括插入、删除等基本功能,并且介绍了双向链表的数据结构及多种链表操作,如插入首尾元素、删除指定元素等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有序链表:

public class Link {
  public long value;
  public Link next;
  
  public Link(long n){
	  value=n;
  }
  
  public void display(){
	  System.out.println(value);
  }
}

//把link[]中的link插入到有序链表中,然后依次输出到link[]
public class LinkInsertApp {
	public static void main(String[] args){
        int size=10;
        Link[] arr=new Link[size];
        for(int i=0;i<size;i++){
        	int n=(int)(java.lang.Math.random()*99);
        	Link l=new Link(n);
        	arr[i]=l;
        }
        System.out.println("unsorted arr:");
        for(int i=0;i<size;i++){
        	arr[i].display();
        }
        System.out.println("sorted arr:");
        sortedLink list=new sortedLink(arr);
        list.displayLink();
        System.out.println("...");
        for(int i=0;i<size;i++){
        	arr[i]=list.remove();
        }
        for(int i=0;i<size;i++){
        	arr[i].display();
        }
        
    }
}

public class sortedLink {
   private Link first;
   
   public sortedLink(){
	   first=null;
   }
   
   public sortedLink(Link[] linkarr){
	   first=null;
	   for(int i=0;i<linkarr.length;i++){
		   insert(linkarr[i]);
	   }
   }
   
   public void insert(Link k){
	    Link pre=null;
	    Link current=first;
	    while(current!=null && k.value>current.value){
	    	pre=current;
	    	current=current.next;
	    }
	    if(pre==null){
	    	first=k;
	    }else{
	    	pre.next=k;
	    }
    	k.next=current;
   }
   
   public void insert(long value){
	   Link a=new Link(value);
	   Link pre=null;
	   Link current=first;
	   while(current!=null &&value>current.value){
		   pre=current;
		   current=current.next;
	   }
	   if(pre==null){
		   first=a;
	   }else{
		   pre.next=a;
	   }
	   a.next=current;
   }
   
   public Link remove(){
	   Link temp=first;
	   if(first==null) {
		   System.out.println("Empty Error");
		   return null;
	   }
	   else {
		   first=first.next;
	       return temp;}
   }
   
   public void displayLink(){
	   System.out.println("sortedLink:f->l");
	   Link current=first;
	   while(current!=null){
		   System.out.println(current.value);
		   current=current.next;
	   }
   } 
}

public class sortedLinkApp {
  public static void main(String[] args){
	  sortedLink arr=new sortedLink();
	  arr.insert(32);
	  arr.insert(11);
	  arr.insert(98);
	  arr.insert(5);
	  arr.remove();
	  arr.remove();
	  arr.remove();
	  arr.remove();
	  arr.remove();
	  arr.displayLink();
  }
}

双向链表:

public class Link {
   public Link next;
   public Link prev;
   public long value;
   
   public Link(long d){
	   value=d;
   }
   
   public void display(){
	   System.out.println(value);
   }
   
}

public class doubleLink {
   private Link first;
   private Link last;
   public doubleLink(){
	   first=null;
	   last=null;
   }
   
   public void insertFirst(long data){
	   Link temp=new Link(data);
	   if(first==null){
		   last=temp;
	   }else{
		   first.prev=temp;
		   temp.next=first;
	   }
	   first=temp;
   }
   
   public void insertLast(long data){
	   Link temp=new Link(data);
	   if(first==null){
		   first=temp;
	   }else{
		   last.next=temp;
		   temp.prev=last;
	   }
	   last=temp;
   }
   
   public Link deleteFirst(){
	   Link temp=first;
	   if(first==null){
		   System.out.println("Empty Error");
	   }else if(first.next==null){
		   last=null;
		   first=null;
	   }else{
		   first.next.prev=null;
	   }
	   first=first.next;
	   return temp;
   }
   
   public Link deleteLast(){
	   Link temp=last;
	   if(first==null){
		   System.out.println("Empty Error");
	   }else if(first.next==null){
		   last=null;
		   first=null;
	   }else{
           last.prev.next=null;
	   }
	   last=last.prev;
	   return temp;
   }
   
   public boolean insertAfter(long key,long data){
	   Link current=first;
	   while(current.value!=key){
		   current=current.next;
		   if(current==null) return false;
	   }
		   Link ll=new Link(data);
		   if(current==last){
			   ll.next=null;
			   last.next=ll;
			   last=ll;
		   }else{
			   ll.next=current.next;
			   current.next.prev=ll;
		   }
		   ll.prev=current;
		   current.next=ll;
		   return true;
   }
   
   public Link deleteKey(long key){
	   Link current=first;
	   while(current.value!=key){
		   current=current.next;
		   if(current==null) return null;
	   }
	   if(current==first) {
		  first=first.next;
	   }else{
		   current.prev.next=current.next;
	   }
	   if(current==last){
		   last=last.prev;
	   }else{
		   current.next.prev=current.prev;
	   }
	   return current;
   }
   
   public boolean isEmpty(){
	   return first==null;
   }
   
   public void dispalyForward(){
	   Link current=first;
	   while(current!=null){
		   current.display();
		   current=current.next;
	   }
   }
   
   public void displayBackwards(){
	   Link current=last;
	   while(current!=null){
		   current.display();
		   current=current.prev;
	   }
   }
}

public class doubleLinkApp {
  public static void main(String[] args){
	  doubleLink arr=new doubleLink();
	  arr.insertFirst(12);
	  arr.insertFirst(11);
	  arr.insertLast(13);
	  arr.insertAfter(13, 14);
	  arr.deleteLast();
	  arr.insertAfter(12, 100);
	  arr.deleteKey(13);
	  arr.dispalyForward();
	  System.out.println();
	  arr.displayBackwards();
  }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值