链表

四.链表

1.链表的基本实现

头插法实现:

头节点:

public class Link {
   public int iData;
   public double dData;
   public Link next;
 
   public Link(int i, double d) {
      this.iData = i;
      this.dData = d;
   }
 
   public void displayLink() {
      System.out.print("{" + iData + "," + dData + "}");
   }
 
}

链表:

publicclass LinkList {
   private Link frist;
 
   public LinkList() {
      frist = null;
   }
 
   publicboolean isEmpty() {
      returnfrist == null;
   }
 
   publicvoid insertFrist(int i, double d) {
      Link newLink = new Link(i, d);
      newLink.next = this.frist;
      frist = newLink;
   }
 
   public Link deleteFrist() {
      Link temp = frist;
      frist = frist.next;
      return temp;
   }
 
   publicvoid displayLink() {
      System.out.println("frist->last :");
 
      Link current = frist;
      while (current != null) {
         current.displayLink();
         current = current.next;
      }
      System.out.println("");
   }
}

从上面的代码中不难发现链表的数据的插入和删除是从头节点进行的;

2.链表的查找和删除:

public Linkfind(int key) {
      Link current = frist;
      while (current.iData != key) {
         if (current.next == null) {
            returnnull;
         } else {
            current = current.next;
         }
      }
      return current;
   }
public Linkdelete(int key) {
      Link current = frist;
      Link previous = frist;
      while (current.iData != key) {
         if (current.next == null) {
            returnnull;
         } else {
            previous = current;
            current = current.next;
         }
      }
      if (current == frist) {
         frist = frist.next;
      }
      previous.next = current.next;
      return current;
 
   }

3.注意在进行查找时需要一个引用变量,在进行删除时要使用两个引用变量

4.链表的效率:头插法进行的插入和删除操作的时间复杂度为O(1);另外重要的是链表的大小是可变的;

5.使用链表实现栈,链栈的实现:

publicclass LinkStack {
   private LinkList linkList;
 
   public LinkStack() {
      linkList = new LinkList();
   }
 
   publicvoid push(long value) {
      linkList.insertFrist(0, value);
   }
 
   public Link pop() {
      returnlinkList.deleteFrist();
   }
 
   publicboolean isEmpty() {
      returnlinkList.isEmpty();
   }
 
   publicvoid displayStack() {
      linkList.displayLink();
   }
}

链栈的实现是基于链表的头插法进行的,所以相对比较简单;正是因为链表头插法在链表的一端进行正符合栈的特性;

6.同样也可以利用双端链表实现队列;

7.有序链表的实现:

publicclass SortedList {
   private Link frist;
 
   public SortedList() {
      frist = null;
   }
 
   publicboolean isEmpty() {
      returnfrist == null;
   }
 
   publicvoid insert(long value) {
      Link newLink = new Link(0, value);
      Link previous = null;
      Link current = frist;
      while (current != null && value > current.dData) {
         previous = current;
         current = current.next;
      }
      if (previous == null) {
         frist = newLink;
      } else {
         previous.next = newLink;
      }
      newLink.next = current;
   }
 
   public Link remove() {
      Link temp = frist;
      frist = frist.next;
      return temp;
   }
 
   publicvoid display() {
      System.out.println("frist->last :");
 
      Link current = frist;
      while (current != null) {
         current.displayLink();
         current = current.next;
      }
      System.out.println("");
   }
 
}

通过插入有序进行设计有序链表,删除时从链表的头部进行;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值