1、新浪面试题:找到单链表中倒数第K个节点
代码实现:
/**
* 获取倒数第k个节点的信息
* index表示倒数第K个节点
* size是获取有小姐点个数
*/
public static HeroNode findLastNode(HeroNode head, int index){
if (head.next == null){
return null;//链表为空,没找到
}
//先获取一遍链表的长度
int size = getLength(head);
//对index进行校验
if(index<=0||index>size){
return null;
}
HeroNode cur = head.next;
for (int i = 0;i< size - index;i++){
cur = cur.next;
}
return cur;
}
2、腾讯面试题:单链表的反转
1)喊顺平老师的思路:相当于是头插法,取出一个节点就把他放在新链表最前端,最后在接上原本的head节点
难点理解:
cur.next = reverseHead.next 这句话的意思本意是让当前节点的下一个节点链接上reverseHead新链表的最前端,如何理解while循环是关键:
1、next 保存当前节点的下一个节点的值
2、cur.next = reverseHead.next相当于把当前节点的下一节点赋成null值。
3、将当前节点链接上新链表
4、后移赋值
代码实现:
/**
* 实现单链表反转功能(腾讯面试题)
*/
public static void reverseList(HeroNode head){
HeroNode cur = head.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.next;
}
2)第二种解法:直接在单链表上进行反转利用哑头。
class Solution {
public ListNode reverseList(ListNode head) {
ListNode prev = null;
ListNode cur = head;
while(cur != null){//cur == null 相当于已经翻转结束
ListNode nextNode = cur.next;
cur.next = prev;
prev = cur;
cur = nextNode;
}
return prev;
}
}
3、百度面试题:逆序打印,但是不改变原链表结构
1)方式一:利用栈先进后出的优势进行逆序打印
2)反向遍历
这里我们采用第一种方式:
/**
* 实现逆序打印(百度面试题)
* 主要思路:利用栈先进后出的特点
*/
public static void reversePrint(HeroNode head){
if(head.next == null){
System.out.println("链表为空");
return;
}
Stack<HeroNode> stack = new Stack<>();
HeroNode cur = head.next;//辅助节点
//进栈
while(cur != null){
stack.push(cur);
cur = cur.next;//后移,让下一个节点进栈
}
//出栈
while(stack.size()>0){
System.out.println(stack.pop());
}
}