单链表常见面试题
单链表的常见面试题有如下:
1. 求单链表中有效节点的个数
代码如下:
1 //方法:获取到单链表的节点的个数(如果是带头节点的链表,需求不统计头节点) 2 /** 3 * @param head 链表的头节点 4 * @return 返回的就是有效节点的个数 5 */ 6 public static int getLength(HeroNode head){ 7 if(head.next == null) { //空链表 8 return 0; 9 } 10 //定义辅助变量,这里没有统计头节点 11 HeroNode temp = head.next; 12 int length = 0; 13 while(temp != null) { 14 length++; 15 temp = temp.next; 16 } 17 return length; 18 }
2. 查找单链表中的倒数第k个节点
代码如下:
1 //2)查找单链表中的倒数第k个节点【新浪面试题】 2 /** 3 * 思路: 4 * 1.编写一个方法,接收head节点,同时接收一个index 5 * 2.index 表示是倒数第index个节点 6 * 3.先把链表从头到尾遍历,得到链表的总长度 getLength 7 * 4.得到size 后,我们从链表的第一个开始遍历(size - index)个,就可以得到 8 * 5.如果找到了,则返回该节点,否则返回null 9 */ 10 public static HeroNode findLastIndexNode(HeroNode head,int index) { 11 //如果链表为空,返回null 12 if(head.next == null) { 13 return null; 14 } 15 //遍历得到链表的长度(节点个数) 16 int size = getLength(head); 17 //index 校验 18 if(index <= 0 || index > size) { 19 return null; 20 } 21 //定义辅助变量,for 循环定位到倒数的index 22 HeroNode cur = head.next; 23 for(int i = 0; i < size-index;i++) { 24 cur = cur.next; 25 } 26 return cur; 27 }
3. 单链表的反转
代码如下:
1 //3)单链表的反转【腾讯面试题】 2 public static void reverseList(HeroNode head) { 3 //如果当前链表为空,或者只有一个节点,无需反转,直接返回 4 if(head.next == null || head.next.next == null) { 5 return; 6 } 7 8 //定义辅助变量,帮助遍历 9 HeroNode cur = head.next; 10 //指向当前节点[cur]的下一个节点 11 HeroNode next = null; 12 HeroNode reverseHead = new HeroNode(0,"",""); 13 //遍历原来的链表,每遍历一个节点,就将其取出,并放入 reverseHead 的最前端 14 while(cur != null) { 15 next = cur.next;//将next指向cur的下一个节点 16 cur.next = reverseHead.next;//将cur的下一个节点指向reverseHead的最前端 17 reverseHead.next = cur;//将cur连接到新的链表上 18 cur = next;//让cur后移 19 } 20 //将head.next 指向 reverseHead.next ,实现单链表的反转 21 head.next = reverseHead.next; 22 }
以上
朱子家训说:宜未雨而筹谋,勿临渴而掘井。
任何事情要到了跟前才想解决办法,那我们岂不很被动!