1、求链表中有效节点个数
(不算头结点)
//方法:获取单链表节点的有效个数
/**
*
* @param Head 链表头节点
* @return 返回有效个数
*/
public static int getLength(ExerciseNode Head) {
if(Head.next==null) {
return 0;
}
int length = 0;
ExerciseNode newNode = Head.next;
while (newNode != null) {
length++;
newNode = newNode.next;
}
return length;
}
2、新浪面试题
查找单链表倒数第K个节点
- 编写一个方法,接收head节点,同时接收一个index
- index 表示倒数第index个节点
- 先把链表从头到尾遍历,得到总长度 get length
- 得到size后 从链表第一个开始遍历(size -index)个可以得到
//寻找倒数第K个节点
public static HeroNode findLastIndexNode(HeroNode head,int index) {
//判断链表是否为空
if(head.next == null) {
return null;//没有找到
}
//第一次遍历链表长度
int size = getLength(head);
//第二次遍历 size - index位置,
//先做一个index校验
if(index <0 || index>size) {
return null;//没有找到
}
//定义一个辅助变量
HeroNode curr = head.next;
for(int i=0;i<size-index;i++) {
curr = curr.next ;
}
return curr;
}
3、腾讯面试题
实现链表反转
- 先定义一个节点 reverseHead = new HeroNode();
- 从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新链表最前端
- 原来的链表的head.next =reverseHead.next
//将单链表进行反转
public static void reverseList(HeroNode head) {
//当前链表为空或者只有一个节点
if(head.next == null || head.next.next ==null ) {
return ;
}
//定义一个辅助指针,帮助遍历原来的链表
HeroNode cur = head.next;
HeroNode next = null;//指向cur的下一个节点
HeroNode reverseHead = new HeroNode(0,"","");
//遍历原来的链表 每遍历一个节点,就将其取出,放在新链表reverseHead的最前端
while(cur !=null) {
next = cur.next;//先暂时保存当前节点(cur)的下一个节点,后面需要使用
cur.next = reverseHead.next;//将cur的下一个节点指向新链表的最前端
reverseHead.next = cur;//将cur连接到新的链表上!!!!!!!!!!
cur = next;//让cur后移
}
//将head.next 指向reverseHead.next;
head.next = reverseHead.next;
}
4、百度面试题
逆序打印单链表
-
方式一、现将单链表进行反转操作,然后遍历即可,但是会破坏原来单链表结构,不建议;
-
方式二、利用栈,将各个节点压入到栈中,利用栈的先进后出特点。
//逆序打印链表 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;//cur后移,就可以压入下一个节点 } //将栈中节点打印, pop 出栈 while (stack.size()>0 ) { System.out.println(stack.pop());//stack 先进后出 } }