逆置操作:
LinkList Reverse_2(LinkList& L)
{
LNode* pre, * p = L->next, * r = p->next;
p->next = NULL; //处理第一个元素
while (r != NULL) //r为空,则说明p为最后一个节点
{
pre = p;
p = r;
r = r->next;
p->next = pre;
}
L->next = p; //处理最后一个节点
return L;
}
测试代码:
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
typedef struct LNode
{
int data;
struct LNode* next;
}LNode, * LinkList;
LinkList List_H(LinkList& L) //头插法插入元素
{
LNode* s;
int x;
L = (LinkList)malloc(sizeof(LNode));
L->next = NULL;
printf("请输入链表元素的值(输入-1结束)\n:");
scanf_s("%d", &x);
while (x != -1)
{
s = (LNode*)malloc(sizeof(LNode));
s->next = NULL;
s->data = x;
s->next = L->next;
L->next = s;
scanf_s("%d", &x);
}
return L;
}
void Del_x(LinkList& L, int x) //递归调用删除所有值为x的元素
{
LNode* p;
if (L == NULL)
return;
if (L->data == x)
{
p = L;
L = L->next;
free(p);
Del_x(L, x);
}
else
Del_x(L->next, x);
}
LinkList PrintfList(LinkList L) //打印元素
{
LNode* p;
p = L->next; //p指向第1号元素
if (p == NULL)
printf("NULL");
else
printf("打印链表中的元素:");
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
return L;
}
LinkList Reverse_1(LinkList& L) //L为带头结点的链表,现实现就地逆置
{
LNode* p, * r; //p为工作指针,r记录p的后继,防断链
p = L->next; //从第一个节点开始
L->next = NULL; //头节点断开
while (p!=NULL) //依次将元素摘下采用头插法的方式插入元素
{
r = p->next;
p->next = L->next;
L->next = p;
p = r;
}
return L;
}
LinkList Reverse_2(LinkList& L)
{
LNode* pre, * p = L->next, * r = p->next;
p->next = NULL; //处理第一个元素
while (r != NULL) //r为空,则说明p为最后一个节点
{
pre = p;
p = r;
r = r->next;
p->next = pre;
}
L->next = p; //处理最后一个节点
return L;
}
int main()
{
int x=0;
LinkList L;
L = (LinkList)malloc(sizeof(LNode));
List_H(L);
/*
printf("输入需要删除的元素:");
scanf_s("%d", &x);
Del_x(L, x);
*/
PrintfList(L);
Reverse_2(L);
printf("\n逆序后的元素");
PrintfList(L);
return 0;
}