单链表逆置实现(C++)
对于单链表的逆置有两种方法可以实现
(1)利用辅助指针实现
基本思想:在遍历结点的过程中,设置辅助指针,用于记录先前遍历的结点。这样依次遍历的过程中只需修改其后继结点的next域即可。
实现代码如下:
typedef int DataType; //类型定义
typedef struct node{ //单链表定义
DataType data;
struct node* next;
}LinkedNode,*LinkList;
void ReverseList(LinkList& ListHead)
{
cout<<"Begin to Reverse the List"<<endl;
if( (NULL==ListHead)||(NULL==ListHead->next) )return ; //边界检测
LinkedNode* pPre=ListHead; //先前指针
LinkedNode* pCur=pPre->next; //当前指针
LinkedNode* pNext=NULL; //后继指针
while(pCur!=NULL)
{
pNext=pCur->next;
pCur->next=pPre;
pPre=pCur;
pCur=pNext;
}
ListHead->next=NULL; //这一步会使新的尾结点的next域置空
ListHead=pPre; //记录下新的头结点
}
写一个完整的测试用例
#include<stdio.h>
#include<stdlib.h>
typedef struct node //节点类型定义
{
int data;
struct node *next;
}Node;
void printlist(Node *head) //打印链表
{
Node *p = head;
while (p->next)
{
printf("%-4d->", p->data);
p = p->next;
}
printf("%-4d\n", p->data);
}
void reverse(Node *&head) //逆置
{
if (head == NULL || head->next == NULL) //空或者只有一个元素不用逆置
return;
Node *pre, *cur, *rear;
pre = head;
cur = head->next;
while (cur)
{
rear = cur->next;
cur->next = pre;
pre = cur;
cur = rear;
}
//以下两步,很重要
head->next = NULL;
head = pre;
}
int main()
{
Node p9{ 9, NULL };
Node p7{ 7, &p9 };
Node p5{ 5, &p7 };
Node p3{ 3, &p5 };
Node p1{ 1, &p3 };
Node *head = &p1;
printf("原表是\n");
printlist(head);
printf("逆置\n");
reverse(head);
printlist(head);
system("pause");
return 0;
}
(2)递归实现
基本思想:在对当前结点逆置时,先递归地逆置其后继结点,然后将后继结点指向当前结点。
实现代码如下:
void ReverseList(LinkedNode* pCur,LinkList& ListHead)
{
if( (NULL==pCur)||(NULL==pCur->next) )
{
ListHead=pCur;
}
else
{
LinkedNode* pNext=pCur->next;
ReverseList(pNext,ListHead); //递归逆置后继结点
pNext->next=pCur; //将后继结点指向当前结点。
pCur->next=NULL;
}
}
还没有评论,来说两句吧...