【链表】逆序输出单链表(单链表反转)

来源:互联网 发布:mac怎么剪切文件夹 编辑:程序博客网 时间:2024/05/16 00:53

将一个单链表从尾到头反过来打印每个结点的值

我想到了三种方法:

  1. 先反转单链表,然后再从头到尾输出;
    步骤:
    1. 将当前节点的next节点指向他之前的前一个节点;
    2. 当前节点下移一位;
    3. 如果是最后一个节点,就把它的next节点指向它以前的前一个节点,并退出循环;

  2. 利用栈倒序输出链表
    直接访问单链表每个结点,依次将每个结点存储在一个栈中,然后输出这个栈;

  3. 利用递归访问原单链表;
    递归就是一个进栈出栈的过程,链表前面的元素先进栈,在栈底,后面的元素后进栈,在栈顶,先出栈。

创建单链表

单链表结点定义:

struct Node{    int data;    Node *next;};

创建长度为6的单链表

Node* createList(int n){    Node *head,  *ptr,  *newNode;    head = new Node;    //head->data = 0;    head->next = NULL;    ptr = head;    for (int i=0; i<n; i++)    {        newNode = new Node;        newNode->data = i;        newNode->next = NULL;        ptr->next = newNode;        ptr = ptr ->next;    }    return head;}void dispalyList(Node *head){    Node *ptr;    ptr = head ->next;    while(ptr != NULL)    {        cout<<ptr->data<<"->";        ptr = ptr -> next;    }     cout<<"NULL"<<endl;}int main(){    cout<<"创建单链表:"<<endl;    Node *head = createList(6);    dispalyList(head);    cout<<endl;}

这里写图片描述

解法一:先反转,然后依次输出

void reverseLinkList(Node *head){    if(head == NULL)    {        cout<<"error"<<endl;        return;    }    Node *p, *q, *r, *headNode;    headNode = head;    p =head->next;    q = NULL;     while(p!=NULL)     {         r = q;         q = p;         p = p->next;         q ->next = r;     }     headNode ->next = q;//将头指针接在前面     head = headNode;}

调用

cout<<"创建单链表:"<<endl;Node *head = createList(6);dispalyList(head);cout<<endl;cout<<"反转单链表:"<<endl;reverseLinkList(head);dispalyList(head);cout<<endl;

这里写图片描述

解法二:递归

void reverseDisplayLinkList(Node *head){    if(head != NULL)    {        if (head ->next != NULL)        {            reverseDisplayLinkList(head ->next);        }        cout<<head->data<<"->";    }}

调用

 cout<<"创建单链表:"<<endl; Node *head = createList(6); dispalyList(head); cout<<endl; cout<<"反转单链表:"<<endl; reverseDisplayLinkList(head->next);

这里写图片描述