反转链表需要多学习一下,怎么去反转链表之类的。
关于计数法,现在统一一下,能够发现一些东西:
(1) 首先,现在规定就是从0开始,小于size,那么计数得到的结果就是到达size位置,也就是说达到了1到size的功效。
但是计数就是从0开始计数。
(2)任何插入操作,也是遵循从0开始计数,以及插入一个位置,相当于把原来的位置给占据(占据的思想也想一下,就是要到达该位置)
(3)链表的插入,需要到达 指定位置的前一个位置。 前一个位置的思想要有。
(4)因此,按照0到index位置,本来是能够达到index位置的。(根据第一点)
(5)但是,因为在dummyhead开始去计数的,那么会到达index位置的前一个位置。
所以说,根据0到index加上dummyhead 就会到达链表的前一个位置。
所以说这个get为什么要从dummyhead的next开始呢?因为的话是要到达相应的位置,而不是说到达这个位置的前一个,所以说需要从next开始
public class LinkedList<E> {
private class Node{
public E e;
public Node next;
这里说的是结点、内部类,结点作为内部类的话,那么外面已经有泛型了,那么里面不用再写泛型了。
这个学会了结点是怎么写的。
public Node(E e, Node next){
this.e = e;
this.next = next;
}
public Node(E e){
this(e, null);
}
public Node(){
this(null, null);
}
这里说的是:三个构造函数的相互调用,直接用this来相互调用。
if(index<0 && index>=size)
throw new IllegalArgumentException();
对于set的话,那么是大于等于size就是错误,原因:set是从0开始数的,而且是到达了size 那么就是错的超出范围
而对于add的话,大于size才是错,因为等于size的话,是在size的前一个停止。所以说相当于在最后添加一个节点,这是正确的。
无论是基本类型,还是引用类型,都可以用.equals来作为,所以以后判断相等就用.equals 吧。
链表:方便添加、方便删除,不太方便查找。
而数组,方便查找,不方便添加和删除。
而用linkedlist去实现queue,用linkedlist去实现stack目前还没弄,先放着吧。
对于节点,包含节点的,有树,有链表,对于节点来说,要写一个tostring方法来打印。
对于外面的这个链表或者这个数,也写tostring方法,但是调用节点的tostring方法
也就是对于大的结构和小的节点,都需要写tostring方法。
至于dummyhead的目的,自己目前认为是必定加dummyhead的,为了插入等操作的时候,不用区分是不是head插入之类的区别。
原文:https://www.cnblogs.com/startFrom0/p/12605670.html