单链表面试题(新浪、百度、腾讯)
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) ; } }