单链表的逆置问题
(1)注意单链表是否包含头结点
(2)递归:邻位置换
非递归:逆向思维,有个疑问就是递归代码对应的汇编代码
#include <iostream>
#include <time.h>
#include <math.h>
using namespace std;
typedef int DataType; //类型定义
typedef struct node{ //单链表定义
DataType data;
struct node* next;
}LinkNode,*LinkList;
/*
递归算法
(不含头结点)
*/
LinkList ReverseList2(LinkList& ListHead)
{
//如果链表为空或者链表中只有一个元素
if(ListHead == NULL || ListHead->next==NULL)
return ListHead;
else
{
LinkNode* head = ReverseList2(ListHead->next);
//ReverseList2(ListHead->next);
ListHead->next->next = ListHead; //函数返回的是ListHead->next
ListHead->next = NULL;
return head;
}
}
/*
注意:
(1)&是引用操作
(2)此函数操作的是含有头结点的链表
*/
void ReverseList(LinkList& ListHead)
{
cout<<"Begin to Reverse the List"<<endl;
//三种情况
if( ( NULL == ListHead )||( NULL == ListHead->next) || (ListHead->next->next == NULL) )
return ; //边界检测
LinkNode* pPre=ListHead; //先前指针
LinkNode* pCur=pPre->next; //当前指针
LinkNode* pNext=NULL; //后继指针
//ListHead = pCur;
while(pCur!=NULL)
{
cout<<"交换后的当前指针指向的值: ";
cout<<pCur->data<<" "<<endl;
pNext = pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
} //最后pPre指向了最后一个元素
cout<<endl;
ListHead->next->next=NULL;
//构造一个头结点,这里会造成内存泄露
//LinkNode* Head = (LinkNode*)malloc(sizeof(LinkNode));
ListHead->next = pPre;
//ListHead = Head;
}
/*
单链表的创建
(头插法,含有头指针)
*/
LinkList CreateListHead(int n)
{
LinkList LinkHead;
LinkNode* p;
int i;
srand(time(0));
LinkHead = (LinkList)malloc(sizeof(LinkNode));
LinkHead->next = NULL;
for(i = 0; i < n; i++)
{
p = (LinkNode*)malloc(sizeof(LinkNode));
p->data = rand()%100 + 1;
p->next = LinkHead->next;
LinkHead->next = p;
}
return LinkHead;
}
/*
打印单链表的数据(含有头结点)
*/
void print(LinkList &L)
{
LinkNode* p = L;
if(p == NULL)
{
cout<<"Empty list!!!"<<endl;
return;
}
p = p->next;
cout<<"单链表的数据: "<<endl;
while( p->next != NULL)
{
cout<<p->data<<" ";
p = p->next;
}
//cout<<"最后一个数: ";
cout<<p->data<<endl;
cout<<"Finished !!!"<<endl;
}
int main()
{
int n = 10;
LinkList La;
La = CreateListHead(n);
print(La);
//先保存头结点
LinkNode* Head = La;
Head->next = ReverseList2(La->next);
print(La);
return 0;
}