剑指Offer:从尾到头打印链表(一刷)

本文介绍了一种通过遍历链表获取长度,并采用循环方法逆序打印链表元素的算法实现。讨论了不同方法的时间复杂度,并针对空链表进行了特殊处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:输入一个链表,从尾到头打印链表每个节点的值。

本题在开头用注释形式给出了链表类的成员变量名。


我的想法:

无论哪一种,最开始都是循环遍历得到链表的长度n。

第一种循环n次输出n个节点值;输出方法是嵌套一个循环,每次从head开始,时间复杂度为O(n^2)。

第二种是将链表改造为一个循环链表,然后用两层循环,第二层循环的第一次循环从head开始,循环n次,输出节点值,第二次循环从最后一个开始,循环n次,输出节点值...时间复杂度也是O(n^2),但实际上循环次数比第一种更多。

种是将链表改造为一个双向的链表,在链表类中添加一个私有成员指针变量,指向上一个节点,时间复杂度为O(n),然而该题目中链表类的定义已经固定,这种方法不可取。


遇到的问题:

第一次没有考虑到给出的链表也许为空的情况,导致段错误。于是加上了一个特判。

/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {
        
        ListNode* current_node = head;
        int cnt = 0;
        
        if (current_node == NULL) {
            vector<int> result(cnt);
            return result;
        }
        cnt = 1;
        while (current_node -> next != NULL) {
            cnt++;
            current_node = current_node -> next;
        }
        
        current_node -> next = head;
        current_node = head;
        
        vector<int> result(cnt);
        
        for (int i = 0; i < cnt; i++) {
            for (int now = 1; now < cnt; now++) {
                current_node = current_node -> next;
            }
            result[i] = current_node -> val;
        }
        return result;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值