数据结构与算法Java版——单链表的实现

数据结构一般都是由c++来讲解并且实现的,所以如果像我这种没学过c++而学过Java的就很尴尬了,不过不要以为Java不能实现数据结构那些常用的表啊,树啊之类的(不知道有没有同学以为Java没有指针,所以一些功能无法实现呢?这是错误的噢)。这个学期学了数据结构这本书,所以我打算用Java实现其中表,队,栈,树。如果你有兴趣可以持续关注我后续操作。我的CSDN地址为<a href="http://blog.csdn.net/xichang702/article/details/73505933">我的博客</a>,我的个人博客地址为<a href="http://www.xichangblog.com">个人博客</a>


  上次分享的是线性表的实现,不知道各位小伙伴有没有自己动手实现,不过进度不能停。今天记录单链表的实现。虽然Java并没有c++中的指针(真的没有吗?我觉得应该算有的),但是依然可以实现链表,我们可以在Java中用引用变量指向我们的节点,让引用变量代替指针的作用。
  接下来我们就一步步实现吧。
  首先我们要知道什么是节点,在Java中并没有struct,但是我们可以创建一个Node类来表示节点。

  public class Node<T> {

     private T data; //节点的数据
     public Node next; //指向的下一个节点
     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;
     }
}

然后我们需要创建一个链表LinkList类,给它一些基本的属性方法,以及创建构造函数等等。

public class LinkList<T> {

   private Node head; //头结点
   private Node tail; //尾结点
   private int size; //链表长度
​
   public LinkList() {
      head=null;
      tail=null;
   }
 
   //获取链表长度
   public int getLength(){
      return size;
   }
  
    //是否含有元素
   public boolean isEmpty(){
      return size==0;
   }
 
    //清空链表
   public void clear(){
      head=null;
      tail=null;
      size=0;
   }
}

完成以上操作就可以创建一个单链表了。接下来实现LinkList类中的重要方法。
  通过索引获取节点的方法,这应该算是一个中间方法,为实现插入删除做铺垫。

 //通过索引获取节点
   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;
 }

插入方法:个人建议分开写(我是一起写的,发现逻辑会太乱,反正我最后还是分开写了)
1、头插入

2、尾插入

3、中间插入(在这个方法中包含头插入与尾插入)

     //头插入
     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; //尾节点后移
          }
          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);
          }
     }

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

删除最后一个位置的元素

//删除指定位置的元素

     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说明删除的是第一个元素,将头结点指向下一个就行
               head=head.next;
               node=null;
          }else{
               Node preNode=getNodeByIndex(index-1);
               preNode.next=node.next;
               //如果删除的是最后一个元素,尾节点前移一位
               if(index==size-1){
                  tail=preNode;
               }
          }
               size--;
     }
 
     //删除最后一个元素
     public void remove(){
        delete(size-1);
     }

最后实现其他方法(locate找位置,get通过索引获得值,toString直接输出数组),这个单链表的实现就完成了。

    @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)"无此元素";
            return (T) sb;
 }

以上就完成了所有操作,如果小伙伴你懒得实现了,直接复制粘贴也可以成功,最后附上运行结果图:


  这是单链表的实现,如果要做循环链表只需要将tail尾节点指向head头结点即可,有兴趣的小伙伴自己去实现吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容