數(shù)據(jù)結(jié)構(gòu)與算法Java版——單鏈表的實(shí)現(xiàn)

數(shù)據(jù)結(jié)構(gòu)一般都是由c++來(lái)講解并且實(shí)現(xiàn)的,所以如果像我這種沒(méi)學(xué)過(guò)c++而學(xué)過(guò)Java的就很尷尬了,不過(guò)不要以為Java不能實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)那些常用的表啊,樹(shù)啊之類的(不知道有沒(méi)有同學(xué)以為Java沒(méi)有指針,所以一些功能無(wú)法實(shí)現(xiàn)呢氯哮?這是錯(cuò)誤的噢)。這個(gè)學(xué)期學(xué)了數(shù)據(jù)結(jié)構(gòu)這本書(shū)商佛,所以我打算用Java實(shí)現(xiàn)其中表喉钢,隊(duì),棧良姆,樹(shù)出牧。如果你有興趣可以持續(xù)關(guān)注我后續(xù)操作。我的CSDN地址為<a >我的博客</a>,我的個(gè)人博客地址為<a >個(gè)人博客</a>


  上次分享的是線性表的實(shí)現(xiàn)歇盼,不知道各位小伙伴有沒(méi)有自己動(dòng)手實(shí)現(xiàn)舔痕,不過(guò)進(jìn)度不能停。今天記錄單鏈表的實(shí)現(xiàn)豹缀。雖然Java并沒(méi)有c++中的指針(真的沒(méi)有嗎伯复?我覺(jué)得應(yīng)該算有的),但是依然可以實(shí)現(xiàn)鏈表邢笙,我們可以在Java中用引用變量指向我們的節(jié)點(diǎn)啸如,讓引用變量代替指針的作用。
  接下來(lái)我們就一步步實(shí)現(xiàn)吧氮惯。
  首先我們要知道什么是節(jié)點(diǎn)镜遣,在Java中并沒(méi)有struct姥宝,但是我們可以創(chuàng)建一個(gè)Node類來(lái)表示節(jié)點(diǎn)。

  public class Node<T> {

     private T data; //節(jié)點(diǎn)的數(shù)據(jù)
     public Node next; //指向的下一個(gè)節(jié)點(diǎn)
     public Node(T data, Node next) {
         this.data = data;
         this.next=next;
     }

     public Node() { }
     
     public T getData() {
         return data;
     }

     private void setData(T data) {
         this.data = data;
     }
}

然后我們需要?jiǎng)?chuàng)建一個(gè)鏈表LinkList類,給它一些基本的屬性方法诱鞠,以及創(chuàng)建構(gòu)造函數(shù)等等蝶溶。

public class LinkList<T> {

   private Node head; //頭結(jié)點(diǎn)
   private Node tail; //尾結(jié)點(diǎn)
   private int size; //鏈表長(zhǎng)度
?
   public LinkList() {
      head=null;
      tail=null;
   }
 
   //獲取鏈表長(zhǎng)度
   public int getLength(){
      return size;
   }
  
    //是否含有元素
   public boolean isEmpty(){
      return size==0;
   }
 
    //清空鏈表
   public void clear(){
      head=null;
      tail=null;
      size=0;
   }
}

完成以上操作就可以創(chuàng)建一個(gè)單鏈表了膝蜈。接下來(lái)實(shí)現(xiàn)LinkList類中的重要方法乙漓。
  通過(guò)索引獲取節(jié)點(diǎn)的方法,這應(yīng)該算是一個(gè)中間方法,為實(shí)現(xiàn)插入刪除做鋪墊捣郊。

 //通過(guò)索引獲取節(jié)點(diǎn)
   public Node getNodeByIndex(int index){
      if(index<0||index>size-1){
         throw new IndexOutOfBoundsException("索引越界");
      }
      Node node=head;
      for(int i=0;i<size;i++,node=node.next){
          if(i==index){
            return node;
          }
      }
      return null;
 }

插入方法:個(gè)人建議分開(kāi)寫(xiě)(我是一起寫(xiě)的辽狈,發(fā)現(xiàn)邏輯會(huì)太亂,反正我最后還是分開(kāi)寫(xiě)了)
1呛牲、頭插入

2刮萌、尾插入

3、中間插入(在這個(gè)方法中包含頭插入與尾插入)

     //頭插入
     public void addAtHead(T element){
          head=new Node<T>(element, head);
          //如果是空鏈表就變讓尾指針指向頭指針
          if(tail==null){
               tail=head;
          }
          size++;
     }
 
     //尾插入
      public void addAtTail(T element){
          //如果表為空
          if(head==null){
               head=new Node<T>(element, null);
               tail=head;
          }else{
               Node node=new Node<T>(element, null);
               tail.next=node;
               tail=node; //尾節(jié)點(diǎn)后移
          }
          size++;
     }
 
     //在指定位置插入元素
     public void insert(T element,int index){
          if(index<0||index>size){
               throw new IndexOutOfBoundsException("索引越界");
          }
          if(index==0){
               addAtHead(element);
          }else if(index>0&&index<size-1){
                //中間插入
               Node nexNode=null;
               Node insNode=new Node<T>(element, nexNode);
               nexNode=getNodeByIndex(index);
               Node preNode=getNodeByIndex(index-1);
               preNode.next=insNode;
               insNode.next=nexNode;
               size++;
          }else {
               addAtTail(element);
          }
     }

刪除方法:
刪除指定位置元素

刪除最后一個(gè)位置的元素

//刪除指定位置的元素

     public void delete(int index){
          if(index<0||index>size-1){
               throw new IndexOutOfBoundsException("索引越界");
          }
          int flag=index-1;
          Node node=getNodeByIndex(index);
          if(flag < 0){
                //flag<0說(shuō)明刪除的是第一個(gè)元素娘扩,將頭結(jié)點(diǎn)指向下一個(gè)就行
               head=head.next;
               node=null;
          }else{
               Node preNode=getNodeByIndex(index-1);
               preNode.next=node.next;
               //如果刪除的是最后一個(gè)元素着茸,尾節(jié)點(diǎn)前移一位
               if(index==size-1){
                  tail=preNode;
               }
          }
               size--;
     }
 
     //刪除最后一個(gè)元素
     public void remove(){
        delete(size-1);
     }

最后實(shí)現(xiàn)其他方法(locate找位置,get通過(guò)索引獲得值畜侦,toString直接輸出數(shù)組),這個(gè)單鏈表的實(shí)現(xiàn)就完成了躯保。

    @Override
     public String toString() {
          StringBuilder sb=new StringBuilder();
          Node node=head;
          for(int i=0;i<size;i++,node=node.next)
          {
               sb=sb.append(node.getData()+" ");
          }
          return sb+"";
     }
?
      //獲得指定位置元素
      public T get(int index){
           return (T) getNodeByIndex(index).getData();
      }
 
      //獲得指定元素的索引
      public T locate(T element){
            Node node=head;
            StringBuilder sb=new StringBuilder();
            for(int i=0;i<size;i++,node=node.next)
            {
                  if(element.equals(node.getData()))
                  {
                        sb=sb.append(i+" ");
                  }
            }
            if(sb.length()<=0)
                  return (T)"無(wú)此元素";
            return (T) sb;
 }

以上就完成了所有操作旋膳,如果小伙伴你懶得實(shí)現(xiàn)了,直接復(fù)制粘貼也可以成功途事,最后附上運(yùn)行結(jié)果圖:


  這是單鏈表的實(shí)現(xiàn)验懊,如果要做循環(huán)鏈表只需要將tail尾節(jié)點(diǎn)指向head頭結(jié)點(diǎn)即可,有興趣的小伙伴自己去實(shí)現(xiàn)吧尸变。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末义图,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子召烂,更是在濱河造成了極大的恐慌碱工,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奏夫,死亡現(xiàn)場(chǎng)離奇詭異怕篷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)酗昼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)廊谓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人麻削,你說(shuō)我怎么就攤上這事蒸痹。” “怎么了呛哟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵叠荠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我扫责,道長(zhǎng)蝙叛,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任公给,我火速辦了婚禮借帘,結(jié)果婚禮上蜘渣,老公的妹妹穿的比我還像新娘。我一直安慰自己肺然,他們只是感情好蔫缸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著际起,像睡著了一般拾碌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上街望,一...
    開(kāi)封第一講書(shū)人閱讀 51,692評(píng)論 1 305
  • 那天校翔,我揣著相機(jī)與錄音,去河邊找鬼灾前。 笑死防症,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哎甲。 我是一名探鬼主播蔫敲,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炭玫!你這毒婦竟也來(lái)了奈嘿?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吞加,失蹤者是張志新(化名)和其女友劉穎裙犹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體衔憨,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伯诬,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了巫财。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盗似。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖平项,靈堂內(nèi)的尸體忽然破棺而出赫舒,到底是詐尸還是另有隱情,我是刑警寧澤闽瓢,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布接癌,位于F島的核電站,受9級(jí)特大地震影響扣讼,放射性物質(zhì)發(fā)生泄漏缺猛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望荔燎。 院中可真熱鬧耻姥,春花似錦、人聲如沸有咨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)座享。三九已至婉商,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間渣叛,已是汗流浹背丈秩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淳衙,地道東北人蘑秽。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像滤祖,于是被迫代替她去往敵國(guó)和親筷狼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子瓶籽,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容