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