单链表相关题目

一、求单链表中有效节点的个数:

1. //获取链表中的有效节点数  
2.     //方法:获取到单链表的节点的个数(如果是带头结点的链表,需求不统计头节点)  
3.     public static int getLength(hero head) {  
4.         if (head.getNext() == null) {//空链表  
5.             return 0;  
6.         }  
7.         int length = 0;  
8.         //定义一个辅助的变量, 这里我们没有统计头节点  
9.         hero temp = head.getNext();  
10.         while (temp != null) {  
11.             length++;  
12.             temp = temp.getNext();//遍历  
13.         }  
14.         return length;  
15.     }  

 

二、查找单链表中倒数第k个结点:

思路分析:

1. 编写一个方法,接收 head 节点,同时接收一个 index
2. index 表示是倒数第 index 个节点
3. 先把链表从头到尾遍历,得到链表的总的长度 getLength
4. 得到 size 后,我们从链表的第一个开始遍历 (size-index)个,就可以得到
5. 如果找到了,则返回该节点,否则返回 null

 

1. public static hero getLastIndexNode(hero head, int index) {  
2.         if (head.getNext() == null) {//判断如果链表为空,返回 null  
3.             return null;  
4.         }  
5.         int length = getLength(head);//第一个遍历得到链表的长度(节点个数)  
6.         //第二次遍历 size-index 位置,就是我们倒数的第 index 个节点  
7.         //做一个 index 的校验  
8.         if (index <= 0 || index > length) {  
9.             return null;  
10.         }  
11.         hero temp = head.getNext();//定义给辅助变量, for 循环定位到倒数的 index  
12.         for (int i = 0; i < length - index; i++) {  
13.             temp = temp.getNext();  
14.         }  
15.         return temp;  
16.     }  

 

三、单链表的反转:

思路分析:

1.先定义一个新的头结点: reverseHead=new Hero(); 
2.从头到尾遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端
3、 原链表的head.next=reverseHead.next 

1. //将单链表反转(面试题)  
2.    public static void reverseList(hero head) {  
3.        //如果当前链表为空,或者只有一个节点,则无需反转,直接返回  
4.        if (head.getNext() == null || head.getNext().getNext() == null) {  
5.            return;  
6.        }  
7.        //定义一个辅助的变量,帮助我们遍历原来的链表  
8.        hero temp = head.getNext();  
9.        hero tempNext = null;//用于存放指向当前temp节点的下一个节点  
10.        hero reverseLink = new hero(-1, "", "");//定义新的头结点(属于无效节点)  
11.        //遍历原来的链表,每遍历一个节点,就将其取出,并放在新的链表(reverseLink)的最前端  
12.        while (temp != null) {  
13.            tempNext = temp.getNext();//先暂时保存当前节点的下一个节点,因为后面需要使用  
14.            temp.setNext(reverseLink.getNext());//将当前temp的下一个节点指向新的链表(reverseLink)的第一个有效节点  
15.            reverseLink.setNext(temp);//将新的链表的头结点指向temp,即将temp连接到新的链表上  
16.            temp = tempNext;//让temp后移  
17.        }  
18.        //将head.next指向reverseLink。next,实现单链表的反转  
19.        head.setNext(reverseLink.getNext());  
20.    }  

四、从尾到头打印单链表

思路分析:

  1. 上面的题的要求就是逆序打印单链表.
  2. 方式1: 先将单链表进行反转操作,然后再遍历即可,这样的做的问题是会破坏原来的单链表的结构
  3. 方式2:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点实现了逆序打印的效果.

举例演示栈的使用 Stack

1. //从尾到头打印单链表(面试题)  
2.    //可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点,就实现了逆序打印的效果  
3.    public static void reversePrint(hero head){  
4.        if (head.getNext()==null){//空链表,不能打印  
5.            return;  
6.        }  
7.        Stack<hero> stack = new Stack<>();//创建要给一个栈,将各个节点压入栈  
8.        hero temp=head.getNext();  
9.        //将链表的所有节点压入栈  
10.        while (temp!=null){  
11.            stack.push(temp);  
12.            temp=temp.getNext();//temp 后移,这样就可以压入下一个节点  
13.        }  
14.        //将栈中的节点进行打印,pop 出栈  
15.        while (stack.size()>0){  
16.            System.out.println(stack.pop());//stack 的特点是先进后出  
17.        }  
18.    }  

 

 

 

posted @ 2020-10-15 21:45  白刃天使  阅读(114)  评论(0编辑  收藏  举报