链表的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的实现相关的知识,希望对你有一定的参考价值。

内存结构:链表也是数据结构的一种,但是和数组不一样,数组在内存中每个节点的位置是相连的。而链表的每个节点在对象中是分散的,依靠引用相连。

优点1:单链表在增加和删除上要比数组结构更加快捷。

原因:因为顺序表在内存中是相连的,所以删除一个节点,在该节点之后的节点都要随之前移,所以效率不高。

            而单链表使用引用彼此相连的,所以在删除增加时只需给引用重新赋值即可。所以效率会比较高

优点2:单链表可以无限增加,而数组在创建是就已经被固定了大小

缺点:因为单链表必须依靠引用来找到下一个节点,所以在做搜索时的效率会比较差。而顺序表在做搜索时的效率会比较高。

 

综上所述:如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

接下来就是代码了,

节点的定义:

技术分享

接下来就是代码了,

节点的定义:

 1 class Node{
 2     int value;
 3     int n;            //节点编号
 4     Node next,pre;
 5     Node(){
 6         value = 0;
 7         next = null;
 8         pre = null;
 9     }
10     Node(int v){
11         value = v;
12         next = null;
13         pre = null;
14     }
15     public void setValue(int value){
16         this.value = value;
17     }
18     public int getValue(){
19         return value;
20     }
21 }

链表的实现:

public class LinkList{
    private int size = 0;                    //用于描述链表长度
    Node lastNode = new Node();                //用于分辨最后一个节点
    Node headNode = new Node();    
    public boolean add(Node node){                //增加节点
        if(size == 0){                        //插入第一个节点时
            headNode.next = node;
            lastNode = node;                
            lastNode.pre = headNode;
            size ++;
            lastNode.n = size;
            return true;
        }
        else{        
            lastNode.next = node;
            node.pre = lastNode;
            lastNode = node;
            size ++;
            lastNode.n = size;
            return true;
        }
    }
    public void add(int index, Node node){        //在指定位置插入节点。
        Node temp = new Node();                    //临时节点,用于顺序查找
        temp = headNode.next;
        for(int i = 1; i < index; i++){            //查找指定位置节点
            temp = temp.next;
        }
        temp.pre.next = node;                    //进行插入操作
        node.next = temp;
        node.pre = temp.pre;
        temp.pre = node;
        size ++;
    }
    public boolean delete(int index){            //删除指定位置的节点。
        if(index > size)
            return false;
        else
        {
            Node temp = new Node();                
            temp = headNode.next;                //临时节点,用于顺序查找
            for(int i = 1; i < index; i++){        //查找指定位置节点    
                temp = temp.next;
            }
            temp.pre.next = temp.next;            //进行删除操作
            temp.next.pre = temp.pre;
            size --;
            return true;
        }
    }
    public Node get(int index){                    //获取指定位置的节点
        if(index > size)
            return null;
        else{
            Node temp = new Node();
            temp = headNode.next;
            for(int i = 1; i < index; i++){
                temp = temp.next;
            }
            return temp;
        }
    }
    public boolean isEmpty(){                    //检测该链表是否为空
        if(this.size == 0)
            return true;
        else
            return false;
    }
    public int size(){
        return size;
    }
}

该方法只定义了一些简单的增删改查功能。

ps:额,因为初写博客不久,所以可能会有不足,在这里与大家分享,有什么问题也希望大家多多指出啦!!!^-^

 

 

以上是关于链表的实现的主要内容,如果未能解决你的问题,请参考以下文章

链表的java实现(单向双向链表,单向链表的反转)

链表的java实现(单向双向链表,单向链表的反转)

数据结构《二》链表的实现

代码模板实现双向链表的去重拼接合并排序

Java中双向链表的代码实现

链表的反转思路及代码实现