单链表常见面试题

单链表的常见面试题有如下:

  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     }

以上

posted @ 2019-12-29 21:30  指尖上的生产者  阅读(527)  评论(0编辑  收藏  举报