天天看点

单链表,单链表面试题_韩顺平听课笔记

16.单链表介绍和内存布局;链表(Linked List),有带头结点和不带头结点之分;链式存储,每个结点的位置不确定

单链表,单链表面试题_韩顺平听课笔记

17.单向链表的创建和遍历的分析实现

单链表创建示意图(添加),遍历分析:

单链表,单链表面试题_韩顺平听课笔记

class Node结构:

单链表,单链表面试题_韩顺平听课笔记

单链表用一个类来实现class singleLinkedList,将一个个的Node对象通过next,在逻辑上相连

head节点private不能动,因此需要辅助变量temp帮助遍历

初始化一个头结点,private head = new Node(0,"","");

temp.next==空时,链表到末尾

添加节点到单向链表(未考虑添加编号顺序问题)

单链表,单链表面试题_韩顺平听课笔记

遍历单向链表

单链表,单链表面试题_韩顺平听课笔记

18.单链表顺序加入节点,可以在内存中就将数据排好序

思路:先找到添加节点的位置,通过辅助变量(指针);新的节点next=temp.next;将temp.next=新的节点

单链表addByOrder方法:

因为单链表是单向的,所以temp是位于插入位置前的节点

通过flag判断添加的编号是否已经存在

若不存在,则添加,新的节点next=temp.next;将temp.next=新的节点

19.单链表的修改update

判断节点是都找到:

通过编号no,找到需要修改的节点

temp=head.next head不参与修改

flag=false 判断被修改节点是否存在

temp==null(因为temp=head.next) 判断是否已在链表末尾,是则break退出循环

temp.no==newNode.no 判断编号是否一致,一致则flag=true,break修改节点

上两个条件不满足则,temp=temp.next,继续判断下一个节点

对节点修改:

如果flag=true,修改节点信息

否则,提示当前编号节点未找到

20.单链表节点的删除

思路:找到被删除节点的前一个节点temp;temp.next=temp.next.next;被删除节点没有其他引用指向,被GC回收

单链表,单链表面试题_韩顺平听课笔记

实现:

head不能动,要一个辅助节点找到待删除节点的前一个节点

temp.next.no与要删除节点的no进行比较,初始:temp=head

flag=false 标志是否找到待删除节点

(判断)temp.next==null,已到链表末尾,break

(判断)temp.next.no==no,找到要删除的节点的前一个节点,flag=true,break

temp=temp.next,继续往下遍历链表

flag==true,删除temp.next节点,temp.next=temp.next.next

21.单链表面试题

统计单链表中有效节点的个数:

思路:

getLength方法,return链表长度length

将head作为参数传入getLength方法

验证链表是否为空,为空结束

用一个辅助变量,cur=head.next即不统计头结点,开始遍历

length++,cur=cur.next

return length

单链表,单链表面试题_韩顺平听课笔记

查找单链表中倒数第k个节点(新浪面试题)

编写一个方法,接收一个head和index=k,return 第k个节点

先遍历一遍链表,得到链表的长度size

index表示倒数第index个元素

再将链表遍历,输出第size-index个元素

单链表,单链表面试题_韩顺平听课笔记
单链表,单链表面试题_韩顺平听课笔记

22.单链表的反转(腾讯面试)

定义一个新节点reverseHead作为翻转链表的头

将原始链表从头开始遍历,每取出一个元素node,就将元素放于reverseLinkedList的第一个位置,即node.next=reverseHead.next,reverseHead.next=node (因为需要从初始链表取数据,所以需要一个额外的变量next指向当初始链表的下一个要取的元素)

将原始链表遍历完后,原始链表的头指针指向翻转链表的第一个元素,head.next=reverseHead.next

单链表,单链表面试题_韩顺平听课笔记
单链表,单链表面试题_韩顺平听课笔记
单链表,单链表面试题_韩顺平听课笔记

23.从尾到头打印单链表,要求方式1:反向遍历(破坏链表结构,不建议使用),方式2:Stack栈(百度面试)

单链表,单链表面试题_韩顺平听课笔记

栈的基本使用:

单链表,单链表面试题_韩顺平听课笔记
单链表,单链表面试题_韩顺平听课笔记

练习:合并两个有序的单链表,合并之后的链表依然有序

创建一个新的newHead节点,作为合并后的链表表头

取单链表数据时进行判断,哪个更小/更大,则加入链表尾部/第一个位置