逆向打印单链表

这里我们将介绍逆向打印单链表的三种方法:

  1. 利用循环以及三个指针,将单链表的_pNext指针的指向改变(这种方法改变了单链表)
  2. 利用栈的特性“先进后出”来实现,将链表结点的值全部入栈后再依次出栈
  3. 利用递归来实现

    给出结点

#include<stdio.h>
#include<iostream>
using namespace std;

//单链表
typedef struct Node
{
    Node(int data)
        :_data(data)
        ,_pNext(NULL)
    {}
    int _data;
    Node* _pNext;
}*PNode;

方法一:

Node* ReverseList(Node*& pHead)
{
    if(pHead == NULL)
        return NULL;
    Node* pPreNode = pHead;
    Node* pCurNode = pHead->_pNext;
    Node* pNetNode = pHead->_pNext;

    pPreNode->_pNext = NULL;//将第一个结点的_pNext指向NULL,头结点变成尾结点
    while(pCurNode)
    {
        pNetNode = pCurNode->_pNext;
        pCurNode->_pNext = pPreNode;
        pPreNode= pCurNode;
        pCurNode = pNetNode;
    }
    return pPreNode;
}

方法二:

#include<stack>
void PrintListFromTailToHead(Node* pHead)
{
    stack<Node*> nodes;//构建一个栈

    Node* pNode = pHead;
    while(pNode!=NULL)
    {
        nodes.push(pNode);//节点入栈
        pNode = pNode->_pNext;
    }
    while(!nodes.empty())
    {
        pNode = nodes.top();//栈顶的元素
        printf("%d\t",pNode->_data);
        nodes.pop();//出栈
    }
}

方法三:

void PrintListFromTailToHead(Node* pHead)
{
    if(pHead==NULL)
        return;
    PrintListFromTailToHead(pHead->_pNext);
    cout<<pHead->_data<<" ";
}

测试代码:

void funtest()
{
    Node n1(1);
    Node n2(2);
    Node n3(3);
    Node n4(4);

    n1._pNext =&n2;
    n2._pNext =&n3;
    n3._pNext = &n4;

    PrintListFromTailToHead(&n1);
}
int main()
{
    funtest();
    getchar();
    return 0;
}
逆向建立单链表的代码解析: 逆向建立单链表是指从链表的尾部开始逐个添加节点,最终形成一个完整的链表。下面是一个简单的 C 语言代码示例: ``` #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* next; }; void addNode(struct Node** head_ref, int new_data) { struct Node* new_node = (struct Node*)malloc(sizeof(struct Node)); new_node->data = new_data; new_node->next = (*head_ref); (*head_ref) = new_node; } void printList(struct Node* node) { while (node != NULL) { printf("%d ", node->data); node = node->next; } } int main() { struct Node* head = NULL; addNode(&head, 1); addNode(&head, 2); addNode(&head, 3); printf("Reversed Linked list: "); printList(head); return 0; } ``` 在这个代码中,我们定义了一个结构体 `Node`,其中包含了一个整数类型的数据 `data` 和一个指向下一个节点的指针 `next`。我们还定义了两个函数 `addNode` 和 `printList`,分别用于添加节点和打印链表。 在 `addNode` 函数中,我们首先使用 `malloc` 函数动态分配了一个新的节点,并将新节点的 `data` 值设置为传入的参数 `new_data`。然后,我们将新节点的 `next` 指针指向当前链表的头节点,最后将新节点设置为新的头节点。 在 `printList` 函数中,我们使用一个循环遍历整个链表,并打印每个节点的 `data` 值。 在 `main` 函数中,我们首先定义了一个空的头节点 `head`,然后依次调用 `addNode` 函数添加三个节点,最后调用 `printList` 函数打印整个链表。 运行这个程序,我们可以得到如下输出: ``` Reversed Linked list: 3 2 1 ``` 这个输出表示我们成功地逆向建立了一个包含三个节点的单链表
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值