题目:输入一个链表(无环单链表)的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:
typedef struct listNode
{
struct listNode* next;
int data;
}Node;
分析:
这题我有两种思路,一种:是常规思路,把链表逆过来,再遍历。
还有一种:借助于栈来实现(使用栈的先进后出的特点)。
不过后者再空间上的消耗要大,空间复杂度为O(n).
下面来实现下常规思路:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
struct ListNode{
int m_nKey;
ListNode* m_pNext;
ListNode(int key){ m_nKey = key; m_pNext = NULL;}
};
void printReverseList(ListNode* head)
{
if(head == NULL) return;
//reverse list
ListNode* p1, *p2, *p3;
p1 = head;
p2 = p1->m_pNext;
p1->m_pNext = NULL;
while(p2)
{
p3 = p2->m_pNext;
p2->m_pNext = p1;
p1 = p2;
p2 = p3;
}
head = p1;
while(p1)
{
cout << p1-> m_nKey << " ";
p1 = p1->m_pNext;
}
}
int main()
{
ListNode* head = new ListNode(1);
int i = 1;
ListNode* p = head;//1->2->3->4->5->6->7->8->9->10
while( i < 10)
{
ListNode *node = new ListNode(++i);
p->m_pNext = node;
p = p->m_pNext;
}
printReverseList(head);
return 0;
}
输出结果为:
10 9 8 7 6 5 4 3 2 1
说明输入的顺序为:1->2->3->4->5->6->7->8->9->10
刚看了的博客
http://blog.csdn.net/zhulei632/article/details/6736260
还有一种很简便的方法,
递归方法,实现如下:
void printReverseList1(ListNode* head)
{
if(head)
{
printReverseList1(head->m_pNext);
cout << head->m_nKey << " ";
}
}