printListReverse

本文介绍了一种从尾到头打印链表节点值的方法,通过两种实现方式:利用栈先入后出特性及递归调用来解决该问题。栈方法通过遍历链表将各节点值压入栈中,再依次弹出;递归方法则直接利用函数调用堆栈特性实现逆序输出。
剑指offer题目6:

输入一个链表,从尾到头打印链表每个节点的值
[]https://www.nowcoder.com/practice/d0267f7f55b3412ba93bd35cfa8e8035?tpId=13&tqId=11156&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

  • 使用栈:
/**
*  struct ListNode {
*        int val;
*        struct ListNode *next;
*        ListNode(int x) :
*              val(x), next(NULL) {
*        }
*  };
*/
class Solution {
public:
    vector<int> printListFromTailToHead(ListNode* head) {

        std::stack<int> ans;
        std::vector<int> vec;

        while (head){
            int temp = head->val;
            ans.push(temp);
            head = head->next;
        }

        while(!ans.empty()){
            int t = ans.top();
            vec.push_back(t);
            ans.pop();

        }

        return vec;
    }

}
  • 递归调用:
void PrintListReversingly_Recursively(ListNode* pHead)
{
    if(pHead != nullptr)
    {
        if (pHead->m_pNext != nullptr)
        {
            PrintListReversingly_Recursively(pHead->m_pNext);
        }

        printf("%d\t", pHead->m_nValue);
    }
}
1. 双向链表-非循环链表基本操作 【问题描述】 仿照有头结点单链表的存储和基本操作,设计双向链表-非循环链表(初始化、插入、输出)。 对带头结点的双向链表,实现数据插入。 【输入形式】 第一行输入一个N(N大于等于1,小于1000); 第二行输入N个整数,以空格作为分隔,创建长度为N的双向链表,为双向输出方便,需保留头尾指针; 第三行输入pos和e,以空格分隔,分别表示插入位置和插入元素的值。 【输出形式】 若插入位置合法,插入成功,则输出: 第一行从头开始顺向输出双向链表中元素,用空格分隔; 第二行从尾结点开始逆向输出双向链表中元素,用空格分隔。 若插入位置不合法,例如插入位置<1或超出链表范围,则输出error。 【样例输入1】 5 -4 5 2 7 0 2 100 【样例输出1】 -4 100 5 2 7 0 0 7 2 5 100 -4 【样例输入2】 5 1 2 3 4 5 6 6 【样例输出2】 1 2 3 4 5 6 6 5 4 3 2 1 【样例输入3】 5 1 2 3 4 5 8 8 【样例输出3】 error C (current) #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct LNode{ ElemType data; struct LNode *next; struct LNode *prior; }LNode,*Llist; //初始化 LNode *initList() { } //输入n个数据,并创建链表 LNode *createList(LNode * head,int n) { LNode *rear, *s; ElemType e; rear=head; while(n--){ s=(LNode *)malloc(sizeof(LNode)); if(s==NULL){ return NULL; } scanf("%d",&e); s->data=e; s->next=NULL; s->prior=rear; rear->next=s; rear=s; } return rear; } //从链表头开始输出元素 void printList(LNode *head) { } //从链表尾逆向输出元素 void printListReverse(LNode *rear,LNode *head) { } //插入新元素,返回尾指针rear LNode *insertList(LNode *head, LNode *rear, int pos, ElemType e) { } int main() { int n,pos,e; LNode *rear,*head=initList(); if(head){ scanf("%d",&n); rear=createList(head,n); scanf("%d%d",&pos,&e); rear=insertList(head,rear,pos,e); if(rear){ printList(head); printListReverse(rear,head); }else{ printf("error"); } } return 0; }
03-19
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值