LinkedList单列表

1、使用已经定义好的 java.util.LinkedList包中的linkedlist完成增加数据的功能。

//导入java中自己的linkedlist包
import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Object> list = new LinkedList<>();//
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");//直接添加元素
        list.add(2,"555");//在下标为2的位置添加元素“555”
        for (int i = 0; i <list.size() ; i++) {
            System.out.println(list.get(i));//得到并输出i值的索引
        }
    }
}

2、仿照 java.util.LinkedList包中的linkedlist 写一个MyLinkedList 来完成增加数据的功能

2.1 新建一个MyLinkedList类并实现list接口(List接口拓展了Collection接口中的方法,有序、可重复、有索引方法,所以我们自己创建的MyLinkedList需要继承List接口)

 出现报错后点击alt+enter键重写List里的方法。

 重写完就不会报错了。

2、2思考如何表示。

在单向链表中,我们把一个结点分为两个部分,一部分是data部分,存放的是元素数据,另一部分是next部分,存放的是下一个结点的地址(方便我们查找下一个结点的位置)

我们可以用一个元素数据为null只有下一个结点的地址的头结点作为头。、

2.3 代码实现

因为java中没有链表数据类型,所以我们可以思考用面向对象的思想,把链表抽象成一个自定义节点类,我们可以用类和属性来抽象出一个结点

//new一个Node类 创建data属性(用)和next属性,创建有参构造和无参构造方法。public 
class Node {
   Object data;

    Node next;

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

    public Node() {
    }
}

 在MyLinkedList中,new一个Node对象,使用int创建一个size来存放元素的个数。

Node head = new Node();
int size;
@Override
public int size() {
    return size;//把返回值改成size
}

找到index方法,进行修改

@Override
public Object get(int index) {
    Node p = head;

    for (int i = 0; i <index ; i++) {
        p = p.next;
    }
    return p.data;
}

 在这段代码中,我们可以把p看为一个工具,我们从头结点head开始,它的next中存放的是下一个元素的地址值,通过把next值赋给p我们可以一直找下一个元素。

找到add方法,进行修改

使用add方法插入一个元素时,先把插入元素的next指向下一个元素的地址值,再取消之前的两个结点间的联系,最后把前一个的next指向插入的地址值就完成了一个元素的插入,几个元素的插入以此类推。

 

@Override
public void add(int index, Object element) {
    // 3.2:找到上一个结点
    Node p=head;
    for (int i = 0; i <index ; i++) {
       p = p.next;
    }
    // 1、创建新的结点
    Node node = new Node();
    // 2、把元素存到结点的data部分
    node.data=element;
    // 3、让node的next部分指向下一个结点(后继)
    node.next = p.next;
    // 4、确定node的直接前驱结点
    p.next = node;

    // 5、更新size
    size++;

2、4创建测试类

3、完整代码

 MyLinkedList.java中

import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class MyLinkedList implements List {
    Node head = new Node();
    int size;
    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public boolean contains(Object o) {
        return false;
    }

    @Override
    public Iterator iterator() {
        return null;
    }

    @Override
    public Object[] toArray() {
        return new Object[0];
    }

    @Override
    public boolean add(Object o) {
        add(size,o);
        return true;
    }

    @Override
    public boolean remove(Object o) {
        return false;
    }

    @Override
    public boolean addAll(Collection c) {
        return false;
    }

    @Override
    public boolean addAll(int index, Collection c) {
        return false;
    }

    @Override
    public void clear() {

    }

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

    @Override
    public Object set(int index, Object element) {
        return null;
    }

    @Override
    public void add(int index, Object element) {
        // 3.2:找到上一个结点
        Node p=head;
        for (int i = 0; i <index ; i++) {
           p = p.next;
        }
        // 1、创建新的结点
        Node node = new Node();
        // 2、把元素存到结点的data部分
        node.data=element;
        // 3、让node的next部分指向下一个结点(后继)
        node.next = p.next;
        // 4、确定node的直接前驱结点
        p.next = node;

        // 5、更新size
        size++;

    }

    @Override
    public Object remove(int index) {
        return null;
    }

    @Override
    public int indexOf(Object o) {
        return 0;
    }

    @Override
    public int lastIndexOf(Object o) {
        return 0;
    }

    @Override
    public ListIterator listIterator() {
        return null;
    }

    @Override
    public ListIterator listIterator(int index) {
        return null;
    }

    @Override
    public List subList(int fromIndex, int toIndex) {
        return null;
    }

    @Override
    public boolean retainAll(Collection c) {
        return false;
    }

    @Override
    public boolean removeAll(Collection c) {
        return false;
    }

    @Override
    public boolean containsAll(Collection c) {
        return false;
    }

    @Override
    public Object[] toArray(Object[] a) {
        return new Object[0];
    }
}

Node.java中

public class Node {
   Object data;

    Node next;

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

    public Node() {
    }
}

Test.java中

public class Test2 {
    public static void main(String[] args) {
        MyLinkedList list = new MyLinkedList();
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");
        list.add(2,"555");
        for (int i = 0; i <=list.size() ; i++) {
            System.out.println(list.get(i));
        }
    }
}
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值