单链表简单实现

一、定义

除了头结点和尾节点,一个节点有唯一的前驱和后继,头结点无前驱,尾节点后继为null。

二、优缺点

        优点:增删操作比较快,因为无需移动节点元素

缺点:查询比较慢,因为无索引,故无法像数组一样根据索引通过一次计算定位

三、简单实现

1、定义一个节点类,包含指向下一个节点的next节点和data(数据)两个属性

public class Node {

    public Node next;

    public Object data;

    public Node(){}

    public Node(Object value){
        this.data = value;
    }

    public Node(Node node,Object value){
        this.next = node;
        this.data = value;
    }
}

2、执行插入操作(如下图)

 public void add(int index, Object element) {
        /**  定义一个a节点指向head节点
         *   循环当index-1的位置时,a.next指向了原来的index位置
         *   p指向了原来index的前驱
         *   那么,可以表明:a.next为新节点的直接后继,a为新节点的直接前驱
         *   */
        Node a = head;
        //初始化新节点
        Node newNode = new Node (  );
        newNode.data = element;
        newNode.next = null;
        //找后继
        for (int i = 0; i < index; i++) {
            a = a.next;
        }
        //此时的p.next指向了要插入的后继
        newNode.next = a.next;
        //p指向了要插入的前驱节点
        a.next = newNode;
        size ++;
    }

3、删除操作

只需将原来连接在一起的断开,使其前驱指向要删除节点的后继

public Object remove(int index) {
        Node p = head;
        for (int i =0 ;i < index ;i++ ){
            p = p.next;
        }
        p.next = p.next.next;
        size --;
        return toString ();
    }

4、查询方法

public Object get(int index) {
        Node p = head.next;
        for (int i = 0; i < index; i++) {
            p = p.next;
        }
        return p.data;
    }

四、测试执行

 public static void main(String[] args) {
        MyLinkedList list = new MyLinkedList ();
        list.add ( 111 );
        list.add ( 222);
        list.add ( 555 );
        list.add ( 666 );
        list.add ( 1,444 );

        System.out.println (list.toString ());

    }


运行结果-----------


[111,444,222,555,666,]

Process finished with exit code 0
public static void main(String[] args) {
        MyLinkedList list = new MyLinkedList ();
        list.add ( 111 );
        list.add ( 222);
        list.add ( 555 );
        list.add ( 666 );
        list.add ( 1,444 );

        System.out.println (list.toString ());
        
        //执行一个删除操作
        list.remove ( 2 );
        System.out.println (list.toString ());
    }



运行结果-------------
[111,444,222,555,666,]
[111,444,555,666,]

Process finished with exit code 0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值