单链表面试题(新浪、百度、腾讯)
public int getCount ( HeroNode head) {
Hero1 cur = head. getNext ( ) ;
int count = 0 ;
while ( cur != null ) {
count++ ;
cur = cur. getNext ( ) ;
}
return count;
}
查找单链表中的倒数第k个结点【新浪面试题】
第一种思路:通过直接计算循环次数来实现查找 第二种思路:定义两个结点n1,n2,先找到第k个结点n1,然后n1、n2结点同时移动。当n1到达链表尾部的后一个元素时,n2所指的就是倒数第k个结点。
public Hero1 findLastIndexNode2 ( Hero1 head, int index) {
if ( head. getNext ( ) == null ) {
return null ;
}
int count = getCount ( ) ;
if ( index <= 0 || index > count) {
return null ;
}
Hero1 cur = head. getNext ( ) ;
for ( int i = 0 ; i < count - index; i++ ) {
cur = cur. getNext ( ) ;
}
return cur;
}
public Hero1 findLastIndexNode ( int index) {
if ( index < 0 ) return null ;
Hero1 node1 = head. getNext ( ) ;
Hero1 node2 = head;
boolean flag = false ;
while ( node1 != null ) {
index-- ;
if ( index == 0 ) {
flag = true ;
break ;
}
node1 = node1. getNext ( ) ;
}
if ( flag) {
while ( node1 != null ) {
node1 = node1. getNext ( ) ;
node2 = node2. getNext ( ) ;
}
return node2;
} else {
return null ;
}
}
单链表的反转【腾讯面试题】
public void reverseLinkedList ( Hero1 head) {
if ( head. getNext ( ) == null || head. getNext ( ) . getNext ( ) == null ) {
return ;
}
Hero1 newHead = new Hero1 ( ) ;
Hero1 cur = head. getNext ( ) ;
Hero1 nextNode;
while ( cur != null ) {
nextNode = cur. getNext ( ) ;
cur. setNext ( newHead. getNext ( ) ) ;
newHead. setNext ( cur) ;
cur = nextNode;
}
head. setNext ( newHead. getNext ( ) ) ;
}
从尾到头打印单链表【百度,要求方式1:反向遍历。方式2:stack】
public void printReverse ( ) {
Stack < Hero1 > stack = new Stack < > ( ) ;
Hero1 cur = head. getNext ( ) ;
while ( cur != null ) {
stack. push ( cur) ;
cur = cur. getNext ( ) ;
}
while ( ! stack. isEmpty ( ) ) {
Hero1 hero = stack. pop ( ) ;
System . out. println ( hero) ;
}
}
public void mergeLinkList ( SingleList list) {
Hero1 cur1 = head;
Hero1 cur2 = list. head. getNext ( ) ;
Hero1 next;
while ( cur1. getNext ( ) != null && cur2 != null ) {
while ( cur1. getNext ( ) != null && cur1. getNext ( ) . getNo ( ) <= cur2. getNo ( ) ) {
cur1 = cur1. getNext ( ) ;
}
next = cur2. getNext ( ) ;
cur2. setNext ( cur1. getNext ( ) ) ;
cur1. setNext ( cur2) ;
cur1 = cur2;
cur2 = next;
}
if ( cur1. getNext ( ) == null ) {
cur1. setNext ( cur2) ;
}
}