Loading

【剑指 Offer】006. 从尾到头打印链表

题目描述

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

  • 示例 1:
    输入:head = [1,3,2]
    输出:[2,3,1]

  • 限制:
    0 <= 链表长度 <= 10000

直接能想到的方法,将链表遍历一遍,遍历的同时将节点值压栈,最后依次出栈。

// C++
// 使用栈实现
vector<int> reversePrint(ListNode *head)
{
    stack<ListNode *> nodes;
    vector<int> res;

    ListNode *pNode = head;
    while (pNode != nullptr)
    {
        nodes.push(pNode);
        pNode = pNode->next;
    }

    while (!nodes.empty())
    {
        pNode = nodes.top();
        res.emplace_back(pNode->val);
        nodes.pop();
    }

    return res;
}
// python
# 利用栈
def reversePrint2(head: ListNode) -> List[int]:
    stack = []
    node = head
    while node:
        stack.append(node)
        node = node.next
    return stack[::-1]
// C++
// 使用递归实现
void reversePrint2(ListNode *head)
{
    if (head->next != nullptr)
    {
        reversePrint(head->next);
    }

    cout << head->val << endl;
}
//python
# 递归
def reversePrint(head: ListNode) -> List[int]:
    return reversePrint(head.next) + [head.val] if head else []

原地修改链表结构

遍历链表的同时,将链表反转

// C++
// 修改链表结构
void reversePrint3(ListNode *head)
{
    if (head == nullptr)
        return;

    // ListNode *nextNode;
    ListNode *node = head;
    ListNode *preNode = nullptr;
    ListNode *nextNode = head;

    while (nextNode != nullptr)
    {
        nextNode = node->next;      // 记录下一个节点
        node->next = preNode;       // 将当前节点的下一个节点改为上一个节点
        preNode = node;             // 链修改完成,将上一个节点移至当前节点,为下一个链修改作准备
        if(nextNode!=nullptr)       // 如果下一个节点不为空,当前节点下移
            node = nextNode;
    }

    while(node!=nullptr)
    {
        cout << node->val << endl;
        node = node -> next;
    }
}
// python
def reversePrint3(head: ListNode) -> List[int]:
    node = head
    preNode = None
    nextNode = head

    while nextNode:
        nextNode = node.next
        node.next = preNode
        preNode = node
        if nextNode:
            node = nextNode
    ret = []
    while node:
        ret += node.val
        node = node.next

    return ret
posted @ 2022-01-05 14:32  锦瑟,无端  阅读(32)  评论(0编辑  收藏  举报