#include<stdio.h>
#include<stdlib.h>
struct LNode
{
int data;
LNode* next;
};
//法一:摘掉头结点使用头插法
LNode* ReverseList(LNode* L) {
LNode* p = L->next; //工作指针
LNode* r = p->next; //找到后继
L->next = NULL;
while (p!=NULL)
{
r = p->next; //先找到后继
p->next = L->next; //头插法 插入两个元素之间
L->next = p;
p = r; //插入完成后使工作指针从其后继继续查找
}
return L;
}
//法二:逆转指针
LNode* ReverseList2(LNode* L) {
LNode* pre; //前驱
LNode* p = L->next; //工作指针
LNode* r = p->next; //后继
p->next = NULL; //处理第一个指针(置空 因为逆置后成为最后一个结点)
while (r != NULL) {
pre = p; //定位到需要逆转指针的结点
p = r; //工作指针后移到新的一个组别防止断链(前中后3个一组)
r = r->next; //后继后移
p->next = pre; //指针逆转
}
L->next = p; //处理头结点
return L;
}
//法3:开辟新的空间使用头插
LNode* RevrseList2(LNode* L) {
LNode* p = L->next; //工作指针
LNode* s = (LNode*)malloc(sizeof(LNode)); //开辟新的空间
s->next = NULL;//初始化
while (p != NULL) {
LNode* q = (LNode*)malloc(sizeof(LNode)); //辅助空间
q->data = p->data; //将数据存入
s->next = q; //头插法
q->next = s->next;
q = q->next; //复制下一个结点
}
return s;
}
多种方法逆置单链表
最新推荐文章于 2024-09-17 16:12:30 发布