程序功能:
实现链表的就地逆序
程序主要思路:
取链表中前三个结点,其中表头结点为空,不存放数据,用结构体指针 head 表示; 第二个结点
用 head->next 进行表示,第三个结点用结构体指针 p 表示。
操作: 效果:
head->next->next = NULL; 令第二个结点的 next 指向 NULL,使第二和第三个结点断开
temp = p->next;
p->next = head->next; // B的next指向A
head->next = p; // head的next指向P
p = temp; // p后移
代码段:
//===============================================================
//Summary:
// C语言 类
//FileName:
// C语言.c
//Remarks:
// 实现就地逆置
//Date:
// 2019/8/9 14:45
//Author:
// 张珂(1575595743@qq.com)
//Version:
// 1.0
//===============================================================
#include<stdio.h>
#include<stdlib.h>
typedef char ElemType;
typedef struct node
{
ElemType data; //定义字符串类型的data变量
struct node *next; //定义结构数组中的指针
}NODE;
//--------------------向链表中填入数据--------------------
void CreatFromTail(NODE* l)
{
NODE *r, *s;
char c; //用来存放输入的字符
int flag = 1; //设置一个标志,初始值为1;当输入"$"符号时,flag为0;建表结束
r = l; //r指针动态指向链表的当前表尾,以便做尾插入,其初值指向头结点
while (flag) //循环输入表中的元素值,将建立的新节点s插入表尾
{
c = getchar(); //获取输入字符
if (c != '$') //判断是否到达输入元素的终点; 没有到达,使用尾插法
{
s = (NODE *)malloc(sizeof(NODE)); //初始化新结点
s->data = c; //为结点赋值
r->next = s; //将新建s结点插在r结点(头结点)之后
r = s; //r结点后移,r始终指向表尾
}
else //元素已经全部插入
{
flag = 0; //确定跳出循环的条件
r->next = NULL; //将最后一个结点的next链域置空,表示链表的结束
}
}
}
//--------------------链表取反-------------------- 方法一
//void Reverse(NODE* head)
//{
// NODE *pf = NULL, *temp = NULL, *pb = NULL;
// pf = head;
// if(head == NULL || head->next == NULL) //当链表是空表,或是只有一个元素时,不需要进行逆序操作
// return ;
// pb = pf->next;
// head->next = NULL; //将head结点从链表中分离出来
// /*
// head-> temp -> head <-temp
// pf pb pf pb
//
// head特别指代头结点; temp是临时结点,每一次循环都会重新定义
// */
//
// while (pb != NULL) //当pb存在时
// {
// temp = pb; //保留原来的结点pb
// pb = pb->next; //pb指向下一结点
// temp->next = pf;
// pf = temp; //pf指向下一结点
// }
//}
//--------------------链表逆序--------------------
void Reverse(NODE * head)
{
NODE *p, *temp;
if (head->next == NULL || head->next->next == NULL)
return;
/* A B C D
- - - - -
head head->next p temp
*/
p = head->next->next;
head->next->next = NULL; //断开A与B, p从B点往后移
while (p != NULL)
{
temp = p->next;
p->next = head->next; //B的next指向A
head->next = p; //head的next指向P
p = temp; //p后移
}
}
//--------------------输出链表--------------------
void printLink(NODE* head)
{
NODE *p = head->next;
while (p != NULL)
{
printf("%c ", p->data);
p = p->next;
}
}
int main()
{
NODE* h;
h = (NODE*)malloc(sizeof(NODE));
h->next = NULL;
printf("please enter some chars:\n"); //输入数据
CreatFromTail(h);
printf("The Link you created is :\n"); //打印输入的数据
printLink(h);
Reverse(h);
printf("\nAfter reverse, the link is :\n"); //打印逆置后的数据
printLink(h);
return 1;
}
参考文章:
https://blog.csdn.net/autumn20080101/article/details/7607148