链表的介绍
- 链表是有序的列表
- 链表是以节点的方式来存储,是链式存储
- 每个节点包含 data 域, next 域:指向下一个节点.
- 链表的各个节点不一定是连续存储.
- 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定
单链表介绍
单链表(带头结点) 逻辑结构示意图如下
单链表的常见面试题有如下:
- 求单链表中有效节点的个数
getLength方法
//方法:获取到单链表的节点个数(如果是带头结点的链表,需要不统计头结点)
// head链表的头结点
// 返回的就是有效节点的个数
public static int getLength(HeroNode head) {
if(head.next ==null) { //空链表
return 0;
}
int length = 0;
//定义一个辅助的变量,这里我们没有统计头结点
HeroNode cur = head.next;
while ( cur != null ) {
length++;
cur = cur.next;//遍历
}
return length;
}
测试getLength方法
//测试一下 求单链表中有效节点的个数
System.out.println(getLength(singleLinkedList.getHead()));
- 查找单链表中的倒数第k个结点 【新浪面试题】
findLastIndexNode方法
//查找单链表中的倒数第K个节点
//思路
//1.编写一个方法,接收head节点,同时接收一个index
//2.index 表示是倒数第index个节点
//3.先把链表从头到尾遍历,得到链表的总的长度 genLength
//4.得到size后,我们从链表的第一个开始遍历(size -index)个,就可以得到
//5.如果找到,则返回该节点,否则返回null
public static HeroNode findLastIndexNode( HeroNode head, int index) {
//判断如果链表为空,返回null
if(head.next == null) {
return null;//没有找到
}
//第一个遍历得到链表的长度(节点个数)
int size = getLength(head);
//第二次遍历size -index 位置,就是我们倒数的第k个节点
//先做一个index的校验
if (index <=0 || index >size) {
return null;
}
//定义给辅助变量,for 循环定位到倒数的index
HeroNode cur = head.next;
for(int i=0; i< size - index;i++) {
cur = cur.next;
}
return cur;
}
测试findLastIndexNode方法
//测试一下看看是否得到了倒数K个节点
HeroNode res = findLastIndexNode(singleLinkedList.getHead(),1);
System.out.println("res=" + res);