单链表,单链表面试题_韩顺平听课笔记
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节点,作为合并后的链表表头
- 取单链表数据时进行判断,哪个更小/更大,则加入链表尾部/第一个位置

浙公网安备 33010602011771号