课后习题 3.10 用栈逆置单链表

LinkList.h

#pragma once
#include<iostream>
using namespace std;

class LNode {
public:
    int data;
    LNode* next;
};

class LinkList {
public:
    LNode* first;

    LinkList() {
        first = new LNode();
        first->data = 666;
        first->next = nullptr;
    }
    void creat(int* arr, int n) {
        LNode* p;
        LNode* s;
        p = first;
        for (int i = 0; i < n; i++) {
            s = new LNode();
            s->data = arr[i];
            s->next = p->next;
            p->next = s;
            p = s;
        }
    }

    void  add(int e) {
        LNode* p;
        LNode* s;
        p = first;
        while (p->next != nullptr) {
            p = p->next;
        }
        s = new LNode();
        s->data = e;
        s->next = p->next;
        p->next = s;
    }

    void show() {
        LNode* p;
        p = first->next;
        while (p != nullptr) {
            cout << p->data << " ";
            p = p->next;
        }
        cout << endl;
    }

};

Stack.h

#pragma once
#include<iostream>
using namespace std;

class Stack {
public:
    int* elements;
    int maxSize;
    int top;

    Stack(int size = 50) {
        maxSize = size;
        elements = new int[maxSize];
        top = -1;
    }
    void push(int e) {
        if (top == maxSize - 1) {
            //略
        }
        else {
            elements[++top] = e;
        }
    }
    bool pop(int& e) {
        bool res = true;
        if (top == -1) {
            res = false;
        }
        else {
            e = elements[top--];
        }
        return res;
    }

};

MyTool.h

#pragma once
#include "LinkList.h"
#include"Stack.h"

class MyTool {
public:
    static void turn(LinkList& L) {
        Stack s;
        LinkList L1;
        LNode* p;
        p = L.first->next;
        while (p != nullptr) {
            s.push(p->data);
            p = p->next;
        }
        int temp;
        while (s.pop(temp)) {
            L1.add(temp);
        }
        L = L1;
    }
};

main.cpp

#include"MyTool.h"

int main() {
    LinkList L;
    int arr[] = { 1,2,3,4,5 };
    L.creat(arr, 5);
    MyTool::turn(L);
    L.show();
    return 0;
}

原文地址:https://www.cnblogs.com/SlowIsFast/p/12630873.html

时间: 2024-09-28 04:21:44

课后习题 3.10 用栈逆置单链表的相关文章

逆置单链表(0957)swust-oj

Description 建立长度为n的单链表,然后将其数据元素逆置,即第1个元素变为最后一个元素,第2个元素变为倒数第2个元素,……,最后一个元素变为第1个元素.(处理的数据类型为字符型.必须使用链表完成.) Input 第一行为链表长度n: 第二行为链表中的n个数据元素的值. Output 逆置后的原始的值. Sample Input 10 A B C D E F G H I Sample Output I H G F E D C B A 分析:逆制,只需要用头插法建立单链表即可: 代码: #

常见算法题:逆置单链表

思路:使用头插法建立单链表,每插入一个节点都插在头结点之后,先使头结点指向NULL,再将剩余结点使用头插法建表,即可实现单链表逆置. 代码: 设目标单链表L,结点为int类型 void Reverse(LinkList &L) { int *p = L.head->next,*q; L.head->next = NULL; while(p!=NULL) { q = p->next; p->next = L.head->next; L.head->next = p

逆置单链表

我自己的方法是用的递归,毕竟也是接触了一点点点点点点 scheme 的骚年是吧,代码如下: ListNode* reverseList(ListNode* head) { if (head == nullptr){ return nullptr; } ListNode* newHead = nullptr; function<void(ListNode*)> reverse; reverse = [&](ListNode* node) { if (node->next == nu

问题 1042: C语言程序设计教程(第三版)课后习题9.10

/******************************************************************** @file Main.cpp @date 2017-05-28 22:10:10 @author Zoro_Tiger @brief 问题 1042: C语言程序设计教程(第三版)课后习题9.10 http://www.dotcpp.com/oj/problem1042.html ***************************************

问题 1020: C语言程序设计教程(第三版)课后习题6.10

/******************************************************************** @file Main.cpp @date 2017-5-17 17:02:42 @author Zoro_Tiger @brief 问题 1020: C语言程序设计教程(第三版)课后习题6.10 http://www.dotcpp.com/oj/problem1020.html ****************************************

逆序单链表

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)

建立源文件List.cpp include "List.h" int main() {     Test();     system("pause");     return 0; } 建立头文件List.h #ifndef __LISH_H__ #define __LISH_H__ #include<iostream> using namespace std; typedef int DataType; struct ListNode {     Li

微软算法100题24 就地逆序单链表

第24 题:链表操作,单链表就地逆置 思路: 本来想拿两个指针分别指向当前节点和上一节点,在向后移动指针的过程中将当前节点的next指针逆向为上一节点,但这样就无法继续向后移动当前节点了.... 转换一下思路,对于n各节点,逆序的操作可以分解为把后面n-1个节点逆序,然后再把第一个节点放在已经逆序好的n-1个元素后面就可以了 -> f(n) = [f(n-1), 1] 最后还是回到了递归上... 其实递归是不是也可以归于divide&conquer范畴呢? 1 package com.rui

谭浩强 c++程序设计第一章课后习题 第10题

#include <iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个整数类型的数字:" <<endl; cin>>a>>b>>c; void sort(int x,int y,int z); sort(a,b,c);//abc有具体值,称为实际参数 return 0; } void sort(int x,int y,int z)/