程序功能:實(shí)現(xiàn)鏈表的就地逆序
程序主要思路:取鏈表中前三個(gè)結(jié)點(diǎn)屯碴,其中表頭結(jié)點(diǎn)為空,不存放數(shù)據(jù)泣栈,用結(jié)構(gòu)體指針 head 表示边灭; 第二個(gè)結(jié)點(diǎn)
用 head->next 進(jìn)行表示饲鄙,第三個(gè)結(jié)點(diǎn)用結(jié)構(gòu)體指針 p 表示。
操作: 效果:
head->next->next = NULL; 令第二個(gè)結(jié)點(diǎn)的 next 指向 NULL几缭,使第二和第三個(gè)結(jié)點(diǎn)斷開
temp = p->next;
p->next = head->next; // B的next指向A
head->next = p; // head的next指向P
p = temp; // p后移
代碼段:
//===============================================================
//Summary:
// C語(yǔ)言 類
//FileName:
// C語(yǔ)言.c
//Remarks:
// 實(shí)現(xiàn)就地逆置
//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; //定義結(jié)構(gòu)數(shù)組中的指針
}NODE;
//--------------------向鏈表中填入數(shù)據(jù)--------------------
void CreatFromTail(NODE* l)
{
NODE *r, *s;
char c; //用來(lái)存放輸入的字符
int flag = 1; //設(shè)置一個(gè)標(biāo)志茶行,初始值為1;當(dāng)輸入"$"符號(hào)時(shí)气堕,flag為0纺腊;建表結(jié)束
r = l; //r指針動(dòng)態(tài)指向鏈表的當(dāng)前表尾,以便做尾插入茎芭,其初值指向頭結(jié)點(diǎn)
while (flag) //循環(huán)輸入表中的元素值揖膜,將建立的新節(jié)點(diǎn)s插入表尾
{
c = getchar(); //獲取輸入字符
if (c != '$') //判斷是否到達(dá)輸入元素的終點(diǎn); 沒(méi)有到達(dá),使用尾插法
{
s = (NODE *)malloc(sizeof(NODE)); //初始化新結(jié)點(diǎn)
s->data = c; //為結(jié)點(diǎn)賦值
r->next = s; //將新建s結(jié)點(diǎn)插在r結(jié)點(diǎn)(頭結(jié)點(diǎn))之后
r = s; //r結(jié)點(diǎn)后移梅桩,r始終指向表尾
}
else //元素已經(jīng)全部插入
{
flag = 0; //確定跳出循環(huán)的條件
r->next = NULL; //將最后一個(gè)結(jié)點(diǎn)的next鏈域置空壹粟,表示鏈表的結(jié)束
}
}
}
//--------------------鏈表取反-------------------- 方法一
//void Reverse(NODE* head)
//{
// NODE *pf = NULL, *temp = NULL, *pb = NULL;
// pf = head;
// if(head == NULL || head->next == NULL) //當(dāng)鏈表是空表,或是只有一個(gè)元素時(shí)宿百,不需要進(jìn)行逆序操作
// return ;
// pb = pf->next;
// head->next = NULL; //將head結(jié)點(diǎn)從鏈表中分離出來(lái)
// /*
// head-> temp -> head <-temp
// pf pb pf pb
//
// head特別指代頭結(jié)點(diǎn)趁仙; temp是臨時(shí)結(jié)點(diǎn)洪添,每一次循環(huán)都會(huì)重新定義
// */
//
// while (pb != NULL) //當(dāng)pb存在時(shí)
// {
// temp = pb; //保留原來(lái)的結(jié)點(diǎn)pb
// pb = pb->next; //pb指向下一結(jié)點(diǎn)
// temp->next = pf;
// pf = temp; //pf指向下一結(jié)點(diǎn)
// }
//}
//--------------------鏈表逆序--------------------
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點(diǎn)往后移
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"); //輸入數(shù)據(jù)
CreatFromTail(h);
printf("The Link you created is :\n"); //打印輸入的數(shù)據(jù)
printLink(h);
Reverse(h);
printf("\nAfter reverse, the link is :\n"); //打印逆置后的數(shù)據(jù)
printLink(h);
return 1;
}
參考文章:
https://blog.csdn.net/autumn20080101/article/details/7607148