链表的结点如下所示,已知链表的头结点head,写一个函数把这个链表逆序。
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
链表逆序的实现过程:
下列代码采用了递归方式和非递归方式两种方法,实现了链表逆序问题,代码可以直接使用。
#include <iostream>
using namespace std;
struct Node
{
int data ;
Node *next ;
};
typedef struct Node Node ;
//创建链表节点
Node* CreateNode()
{
Node *head = NULL;
Node *pnew = NULL;
Node *tail = NULL;
int d;
while(1)
{
cin >> d;
if (d==0)
break;
pnew = new Node;
pnew->data = d;
pnew->next = NULL;
if(head == NULL)
{
head = pnew;
tail = pnew;
}
else
{
tail->next = pnew;
tail = pnew;
}
}
return head;
}
void PrintList(Node *head)
{
if (head== NULL)
return ;
while(head)
{
cout << head->data << " ";
head = head->next;
}
cout << endl;
}
//链表逆序,非递归方式
Node * ReverseLink(Node *head)
{
Node *next;
Node *prev = NULL;
while(head != NULL)
{
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
//链表逆序,递归方式
Node *ReverseLink2(Node *head)
{
Node *newHead;
if((head == NULL) || (head->next == NULL))
return head;
newHead = ReverseLink2(head->next); /*递归部分*/
head->next->next = head; /*回朔部分*/
head->next = NULL;
return newHead;
}
int main(int argc, char ** argv)
{
Node *head = CreateNode();
PrintList(ReverseLink(head));
return 0;
}