单链表相关题目
一、求单链表中有效节点的个数:
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:可以利用栈这个数据结构,将各个节点压入到栈中,然后利用栈的先进后出的特点实现了逆序打印的效果.
举例演示栈的使用 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. }