程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> Java語言中鏈表和雙向鏈表的實現

Java語言中鏈表和雙向鏈表的實現

編輯:JAVA編程入門知識
  鏈表是一種重要的數據結構,在程序設計中占有很重要的地位。C語言和C++語言中是用指針來實現鏈表結構的,由於Java語言不提供指針,所以有人認為在Java語言中不能實現鏈表,其實不然,Java語言比C和C++更輕易實現鏈表結構。Java語言中的對象引用實際上是一個指針(本文中的指針均為概念上的意義,而非語言提供的數據類型),所以我們可以編寫這樣的類來實現鏈表中的結點。
  
   class Node
  {
   Object data;
   Node next;//指向下一個結點
  }
  將數據域定義成Object類是因為Object類是廣義超類,任何類對象都可以給其賦值,增加了代碼的通用性。為了使鏈表可以被訪問還需要定義一個表頭,表頭必須包含指向第一個結點的指針和指向當前結點的指針。為了便於在鏈表尾部增加結點,還可以增加一指向鏈表尾部的指針,另外還可以用一個域來表示鏈表的大小,當調用者想得到鏈表的大小時,不必遍歷整個鏈表。下圖是這種鏈表的示意圖:
  鏈表的數據結構
  
  我們可以用類List來實現鏈表結構,用變量Head、Tail、Length、Pointer來實現表頭。存儲當前結點的指針時有一定的技巧,Pointer並非存儲指向當前結點的指針,而是存儲指向它的前趨結點的指針,當其值為null時表示當前結點是第一個結點。那麼為什麼要這樣做呢?這是因為當刪除當前結點後仍需保證剩下的結點構成鏈表,假如Pointer指向當前結點,則會給操作帶來很大困難。那麼如何得到當前結點呢,我們定義了一個方法cursor(),返回值是指向當前結點的指針。類List還定義了一些方法來實現對鏈表的基本操作,通過運用這些基本操作我們可以對鏈表進行各種操作。例如reset()方法使第一個結點成為當前結點。insert(Object d)方法在當前結點前插入一個結點,並使其成為當前結點。remove()方法刪除當前結點同時返回其內容,並使其後繼結點成為當前結點,假如刪除的是最後一個結點,則第一個結點變為當前結點。
  
  鏈表類List的源代碼如下:
  
   import java.io.*;
  public class List
  {
   /*用變量來實現表頭*/
   private Node Head=null;
   private Node Tail=null;
   private Node Pointer=null;
   private int Length=0;
   public void deleteAll()
   /*清空整個鏈表*/
   {
  Head=null;
  Tail=null;
  Pointer=null;
  Length=0;
   }
   public void reset()
   /*鏈表復位,使第一個結點成為當前結點*/
   {
  Pointer=null;
   }
   public boolean isEmpty()
   /*判定鏈表是否為空*/
   {
  return(Length==0);
   }
   public boolean isEnd()
   /*判定當前結點是否為最後一個結點*/
   {
  if(Length==0)
   throw new java.lang.NullPointerException();
  else if(Length==1)
   return true;
  else
   return(cursor()==Tail);
   }
   public Object nextNode()
   /*返回當前結點的下一個結點的值,並使其成為當前結點*/
   {
  if(Length==1)
   throw new java.util.NoSUChElementException();
  else if(Length==0)
   throw new java.lang.NullPointerException();
  else
  {
   Node temp=cursor();
   Pointer=temp;
   if(temp!=Tail)
  return(temp.next.data);
   else
  throw new java.util.NoSuchElementException();
  }
   }
   public Object currentNode()
   /*返回當前結點的值*/
   {
  Node temp=cursor();
  return temp.data;
   }
  
   public void insert(Object d)
   /*在當前結點前插入一個結點,並使其成為當前結點*/
   {
  Node e=new Node(d);
  if(Length==0)
  {
   Tail=e;
   Head=e;
  }
  else
  {
   Node temp=cursor();
   e.next=temp;
   if(Pointer==null)
  Head=e;
   else
  Pointer.next=e;
  }
  Length++;
   }
   public int size()
   /*返回鏈表的大小*/
   {
  return (Length);
  
 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved