
package one.Two.List;
import java.util.Iterator;
import java.util.linkedList;
@SuppressWarnings({"all"})
public class linkedListCRUD {
public static void main(String[] args) {
linkedList linkedList = new linkedList();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
System.out.println(linkedList); //[1,2,3]
//演示一个删除结点
linkedList.remove();
System.out.println(linkedList);//[2,3]
//修改某个结点对象
linkedList.set(1,999);//[2,999] 下标 从0开始
System.out.println(linkedList);
//得到某个结点对象
//get(1)是得到双向链表中的第二个对象
Object o = linkedList.get(1);
System.out.println(o);//999
//因为linkedList是实现了 List接口,遍历方式可以迭代器 for
Iterator iterator = linkedList.iterator();
while (iterator.hasNext()) {
Object o1 = iterator.next();
System.out.println(o1);
}
for (Object o1 :linkedList) {
System.out.println(o1);
}
//普通for循环要看具体的实现类有没有size()方法,有就可以使用
for (int i = 0; i
一、
1.起初first/last 都是空。
2.然后执行add方法: 源码实际上调用的是linkLast()方法,顾名思义把添加的对象直接放到最后,起初只有添加的一个“1”,也就是只有一个结点,first/last都指向这一个结点。
3.首先把last给到一个l,l→空,然后他new了一个新的结点,把“1”放入,此时新的结点prev为空,next为空,last指向该结点,然后下面的if语句l为空,然后first也指向该结点,以及newNode也指向该结点。
4.若加入linkedList.add(2),首先如上述,first/last皆指向第一个结点,即prev = null ; item =1 ; next = null。
5.此时l = last 也就是l也指向该结点。然后新建了一个结点,item = 2 ,然后l赋值给第二个结点的prev ,即二结的prev指向一结,然后last = newNode 就是last不在指向一结而指向二结,在往下if语句判定l不为空,则执行else{l.next = newNode},即一结的next指向二结。
6.size++ modCount++
二、
// linkedList.remove有三种,第一种remove(int,index)指定删除哪一个位置,第二种remove()删除第一个,remove(Objece o)先对链表中的对象进行比较,然后删除指定的对象
1.执行removeFirst()
2.首先让f指向first,即指向第一个结点,然后if语句判断f不为空,为空抛出异常(防止删除空链表)。执行unlinkFirst()方法。
3.此时有三个结点,上面我add了个3,此时f指向头结点,last指向尾结点,首先将f.item赋值给element。
4.next指向f.next,即next指向二结,然后f.item即一结item为空,然后令f.next为空,所以一结的next不在指向二结,然后first=next,即first指向二结。然后if语句判定next不为空,执行else{next.prev=null},即二结的prev为空,所以二结的prev不在指向一结,此时一结点就是个孤儿,三个属性都为空。
5.size-- ; modCount++
6.返回element,把原来的值返回去,让人知道删除的内容是什么。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)