算法题目---从尾到头打印链表

来源:互联网 发布:linux怎么粘贴 编辑:程序博客网 时间:2024/06/07 05:28

输入一个链表的头结点,从尾到头反过来打印出每个结点的值。


#include<iostream>

#include<stdio.h>
#include<stdlib.h>
#include<stack>

using namespace std;

struct ListNode
{
    int m_nValue;
    ListNode *m_pNext;

};


//采用栈方法
void PrintListReversingly_Iteratively(ListNode *pHead)
{
    stack<ListNode*>nodes;
    
    ListNode *pNode = pHead;
   
    while(pNode != NULL)
    {
        nodes.push(pNode);
        pNode = pNode->m_pNext;
    }
        
    while(!nodes.empty())
    {
        pNode = nodes.top();
        printf("%d\t",pNode->m_nValue);
        nodes.pop();
    }
    printf("\n");
}


//采用递归方法

void PrintListReversingly_Recursively(ListNode *pHead)
{
    if(pHead != NULL)
    {
        if(pHead->m_pNext != NULL)
        {
                PrintListReversingly_Recursively(pHead->m_pNext);
        }
        printf("%d\t",pHead->m_nValue);
    }

}


//尾加结点
void AddToTail(ListNode **pHead,int value)
{
    ListNode *pNew = new ListNode();
    pNew->m_nValue = value;
    pNew->m_pNext = NULL;
    
    if(*pHead == NULL)
    {
        *pHead = pNew;
    }
    else
    {
        ListNode *pNode = *pHead;
        
        while(pNode->m_pNext != NULL)
            pNode = pNode->m_pNext;
        pNode->m_pNext = pNew;
    }
}


//删除结点

void RemoveNode(ListNode **pHead,int value)
{
    if(pHead == NULL || *pHead == NULL)
            return;
    
    ListNode *pToBeDeleted = NULL;
    if((*pHead)->m_nValue == value)
    {
        pToBeDeleted = *pHead;
        *pHead = (*pHead)->m_pNext;
    }
    else
    {
        ListNode *pNode = *pHead;
        while(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue != value)
                pNode = pNode->m_pNext;

        if(pNode->m_pNext != NULL && pNode->m_pNext->m_nValue == value)
        {
            pToBeDeleted = pNode->m_pNext;
            pNode->m_pNext = pNode->m_pNext->m_pNext;            
        }
    }

    if(pToBeDeleted != NULL )
    {
        delete pToBeDeleted;
        pToBeDeleted = NULL;
    }
}

void test()
{
        //ListNode *p = (ListNode*)malloc(sizeof(ListNode));
        //ListNode *p;// error
        ListNode *p = NULL;
        AddToTail(&p,1);
        AddToTail(&p,2);
        AddToTail(&p,3);
        AddToTail(&p,4);
        AddToTail(&p,5);

         PrintListReversingly_Iteratively(p);
        printf("\n");
        RemoveNode(&p,3);
        PrintListReversingly_Recursively(p);
        printf("\n");
}
原创粉丝点击