数据结构与算法(java)第三章 单链表的面试题
1)求单链表的节点数
2)查找单链表中的倒数第k个节点【新浪面试题】
3)单链表的反转(腾讯面试题)
4)从尾到头打印单链表(百度,要求方式1:反向遍历。方式2:stack栈)
5)合并两个有序的单链表,合并后的单链表仍然有序
1)求单链表的节点数
代码实现:
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;
}
2)查找单链表中的倒数第K个节点
思路:
- 编写一个方法,接收head节点,同时接收一个index(表示倒数第index个节点)
- 先将链表从头到尾遍历得到链表的总长度getLength
- 得到size后,我们从链表的第一个开始遍历(size-index)个,就可以得到
- 如果找到了,返回该节点,否则返回空。
代码实现:
//查找倒数第k个节点
public static HeroNode findLastIndexNode(HeroNode head , int index){
if (head.next == null){
return null;
}
int size = getLength(head);
if (index <=0 || index >size){
return null;
}
HeroNode cur = head.next;
for (int i = 0; i < size-index; i++) {
cur = cur.next;
}
return cur;
}
链表反转的思路
1)定义一个节点reverseHead = new HeroNode();
2)从头到尾遍历原来的链表,每遍历一个节点,将其取出,并放在心得链表reversHead的最前端
3)原来的链表head.next = reverseHead.next
代码实现:
//单链表的反转
public static void reverseList(HeroNode heroNode){
//如果当前链表为空,或者只有一个节点,无需反转,直接返回
if (heroNode.next == null || heroNode.next.next == null){
return;
}
//定义一个辅助变量
HeroNode cur = heroNode.next;
HeroNode next = null;//指向当前节点的下一个节点
HeroNode reverseHead = new HeroNode(0,"","");
//遍历原来的链表
while (cur !=null){
next = cur.next;//暂时保存当前节点的下一个节点
cur.next = reverseHead.next;
reverseHead.next = cur;
cur = next;
}
//将head.next指向reverseHead
heroNode.next = reverseHead.next;
}
从尾到头打印单链表
思路分析:
1)先将单链表反转,然后再遍历(会破坏原来的链表结构,不建议)
2)利用栈,将各个节点压入到栈中,利用先进后出的特点
代码实现:
public static void reversePrint(HeroNode head){
if (head.next == null){
return;//链表为空不需要打印
}
//创建一个栈,将各个节点压入到栈中
Stack<HeroNode> stack = new Stack<HeroNode>();
HeroNode cur = head.next;
while (cur !=null){
stack.push(cur);
cur = cur.next;
}
//将栈中的节点遍历
while (stack.size() > 0){
System.out.println(stack.pop());
}
}