复习
顺序表:
1、构造/销毁
2、插入 头插 | 中间插入(前两个时间复杂度都为O(n))| 尾插O(1)平均
3、删除 头删 | 中间删除 | 尾删O(1)
4、扩容
5、查
6、改
=======================================================================
链表学习开始
链表数据在逻辑上有前后关系,物理上不保证关系
前驱:
后继:
几个操作:
1、头插:
(1)如果要插入的数据没有结点,先将它封装在一个结点内
Node node=new Node();
node.next=null;
或者Node node=new Node(val);
(2)让原来的第一个结点成为新结点(即要插入的结点)的下一个结点
node.next=head;//因为head本来就是指向的第一个结点
(3)更新最新的结点为头结点
head=node;
2、遍历 / 打印整个链表:
Node cur = head;
while ( cur != null ){
System.out.println(cur.val);
cur=cur.next;
}
3、尾插:(尾插必须处理链表为空的情况)
(1)判断链表是否为空:
Node node = new Node(val);
head = node;
(2)链表不为空:
a. 若数据没有在结点内,将数据封装成结点(对象),让新结点的next = null ;
Node node = new Node( val ); node.next=null;
或者用构造函数:Node node = new Node(val);
b. 找到最后一个结点(即找到.next=null 的结点)
Node last = head;
while( last.next != null ){
last=last.next;
}
循环结束后last即为链表的最后一个结点
c. 让新结点成为原来最后一个结点的 .next结点
last.next=node;
4、头删:
head=head.next;
5、尾删:
分情况讨论:
(1)原链表中有一个结点:
head=null;
(2)原链表中有大于一个结点(至少有两个结点):
a. 找到倒数第二个结点:
Node lastSecond = head;
while ( lastSecond.next.next != null ){
lastSecond=lastSecond.next ;
}
b. 让倒数第二个结点的next为null;
c. 最后一个结点因为没有引用而被回收
练习面试题:
反转链表
链表的一些简单知识:
(1)head的意思是链表的第一个结点,通过第一个结点,就可以找到完整的链表的所有结点,所以链表的第一个结点往往代表整个链表
(2)空链表就是一个结点都没有的链表,也就是没有第一个结点,head==null表示第一个结点不存在,也就是整个链表尾空