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