假设需要逆序的单链表为:
则逆置以后的链表为:
代码如下:
#include<iostream>
#include<malloc.h>
using namespace std;
typedef struct node
{
int num;
struct node *next;
}Node;
Node * CreateList(int a[], int n)
{
Node *head, *p, *q;
head = (Node*)malloc(sizeof(Node));
head->next = NULL;
p = head;
for(int i=0; i<n; i++)
{
q = (Node*)malloc(sizeof(Node));
q->num = a[i];//数组元素给链表赋值!!!
p->next = q;
p = q;
}
p->next = NULL;//将最后一个结点的指针域清空
return head;//返回这个链表的首地址
}
void PrintList(Node *head)
{
Node *p;
p = head->next;//从第一个元素(头元素)开始,依次往后
while(p)
{
cout<<p->num<<" ";
p = p->next;
}
cout<<endl;
}
/*--------------------------------------------------------------
单链表逆序/
----------------------------------------------------------------*/
Node *ListReverse(Node *head)
{
Node *current, *pnext, *prev;
if(head == NULL || head->next == NULL)
return head;
current = head->next;//结点current指向首元结点
pnext = current->next;//pnext用来保存当前节点的下一个节点
//current->next一旦将值赋给pnext之后,就可将其置空.它是倒序后的尾结点,所以为空。
current->next = NULL;
while(pnext)
{
//prev用于保存pnext->next,因为这个值将是新链表current的前驱
prev = pnext->next;//让pnext当前的后继作为逆置后的前驱
pnext->next = current;//将current和pnext进行逆置
/*分别更新curren和pnext。
往后遍历,使得前面两步操作往后进行.
我们的目的是将current这个保存当前结点的元素移向后一个结点,
同时把pnext也向后一位,其实就是要把pnext的值赋给current,
还有prev的值赋给pnext*/
current = pnext;//更新current
pnext = prev;//更新pnext
}
head->next = current;//将链表头节点指向currnt
return head;
}
int main()
{
int a[]={1, 2, 3, 4};
Node *head = CreateList(a, 4);
PrintList(head);
ListReverse(head);
PrintList(head);
return 0;
}
结果:
1 2 3 4
4 3 2 1
Process returned 0 (0x0) execution time : 0.224 s
Press any key to continue.