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));
}
}
}