• 面试题5-从头到尾打印链表


    面试题5-从头到尾打印链表

    基础知识

    链表是一种很常见的基本数据结构,因为它的结构简单,通过指针把若干个节点连接成链状结构。链表的创建、插入结点、删除结点等操作都是很容易实现的。链表是一种动态的数据结构,因为在创建链表的时候,无须知道链表的长度。当插入一个新的结点的时候,首先为新的节点分配内存,然后把指针指向新的节点。因为链表是通过指针链接的,不需要整块的连续内存,因此它的空间利用效率比数组高。但是这也造成了在链表中的查询只能从某一节点开始沿着指针遍历链表,它的时间效率为O(n)。下面实现一个简单的链表函数:

    1. class ListNode
    2. public int val; 
    3. public ListNode next = null
    4. public ListNode(int val)
    5. this.val = val; 


    6. void add(ListNode head, int val)
    7. ListNode n = new ListNode(val); 
    8. if(head== null
    9. head = n; 
    10. else
    11. ListNode tmp = head; 
    12. while(tmp.next != null){ 
    13. tmp = tmp.next; 

    14. tmp.next = n; 


    15.  
    16. boolean remove(ListNode head, int val)
    17. if(head == null
    18. return false
    19. if(head.val == val){ 
    20. head = head.next; 
    21. return true

    22. ListNode deletedNode = null
    23. ListNode tmp = head; 
    24. while(tmp.next != null && tmp.next.val != val){ 
    25. tmp = tmp.next; 

    26. if(tmp.next != null && tmp.next.val == val){ 
    27. deletedNode = tmp.next; 
    28. tmp.next = tmp.next.next; 
    29. return true

    30. return false;  

    题目

    输入一个链表的头结点,从头到尾反过来打印每个结点的值。

    解题思路及代码

    1. 单向链表只能按照指针从头到尾一个方向来访问,这个要求的是从尾到头。可以借助栈来实现链表的反转。当从头到尾访问的时候,把链表的每一个结点压入到栈中,根据栈后进先出的特点,那么最后入栈的结点最先出栈,这样逐一输出栈中的结点,就能完成链表的反转。
    1. import java.util.ArrayList; 
    2. import java.util.Stack; 
    3. public class Solution
    4. public ArrayList<Integer> printListFromTailToHead(ListNode listNode)
    5. ArrayList<Integer> res = new ArrayList<>(); 
    6. if(listNode == null
    7. return res; 
    8. Stack<ListNode> s = new Stack<>(); 
    9. ListNode pos = listNode; 
    10. while(pos != null){ 
    11. s.push(pos); 
    12. pos = pos.next; 

    13. while(!s.isEmpty()){ 
    14. res.add(s.pop().val); 

    15. return res; 


    1. 使用递归,当访问到每一个结点的时候,如果它的下一个结点不为空,那么先输出它后面的结点,然后输出它自身。(但是递归有个问题,当链表很长的时候,就会导致函数的调用的层级很深,这就有可能导致函数的调用栈溢出。
    1. import java.util.ArrayList; 
    2. public class Solution
    3. public ArrayList<Integer> printListFromTailToHead(ListNode listNode)
    4. ArrayList<Integer> res = new ArrayList<>(); 
    5. if(listNode == null){ 
    6. return res; 
    7. recursive(listNode,res); 
    8. return res; 

    9. public void recursive(listNode node, ArrayList<Integer> res)
    10. if(node== null
    11. return
    12. else
    13. recursive(node.next,res); 

    14. res.add(node.val); 


  • 相关阅读:
    C 语言模拟 C++ 的多态(利用指针函数)
    emplace_back 使用零拷贝添加元素验证
    const char*和char* 以及string的相互转化.md
    strcpy和memcpy用法(待完善测试用例)
    结构体的比较
    引用在汇编层次上面的解释
    信息安全管理33_防病毒管理策略
    信息安全管理32_通用安全管理checklist
    信息安全管理31_信息安全符合性管理策略
    信息安全管理30_运行管理checklist
  • 原文地址:https://www.cnblogs.com/chailinbo/p/8406871.html
Copyright © 2020-2023  润新知