Java学习第八天2019_7_24 链表

复习

顺序表:

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表示第一个结点不存在,也就是整个链表尾空

发布了78 篇原创文章 · 获赞 4 · 访问量 4180

猜你喜欢

转载自blog.csdn.net/weixin_43580746/article/details/97132667