最近在复习数据结构,刷题正好遇上,所以整理一下。
#include<stdio.h>
#include<stdlib.h>
typedef struct Node
{
char num;
struct Node *next;
}Node;
void Linkreversa(Node * &head);
//创建不带头节点的单链表
Node * Create_LinkNode()
{
Node *head = NULL,*p = NULL,*curr = NULL;
char c;
while((c=getchar())!='\n')
{
p = (Node*)malloc(sizeof(Node));
p->num = c;
p->next = NULL;
if(head==NULL)head = curr = p;
else
{
curr->next = p;
curr = p;
}
}
return head;
}
//输出链表
void print(Node *p)
{
while(p!=NULL)
{
printf("%c\t",p->num);
p = p->next;
}
putchar('\n');
}
int main()
{
Node *root = Create_LinkNode();
puts("\n输出链表:");
print(root);
Linkreversa(root);
puts("\n逆序后:");
print(root);
return 0;
}
//链表逆向
void Linkreversa(Node * &head)
{
/*
o----->o----->o
| | |
curr p nex
*/
Node *curr = head,*p = curr->next,*nex = NULL;
// 当前指针不为空则执行
while(p!=NULL){
//nex指向p的后一个指针(保留p的后继节点)
nex = p->next;
//当前指针的下一个节点指向当前节点
p->next = curr;
/*如果curr是头节点的话,那么让头节点的next指针为空。不然的话,
这个逆向之前的头指针还是会指向第二个节点。*/
if(curr==head)curr->next = NULL;
//当前指针后移
curr = p;
//p指向下一个节点
p = nex;
}
//指向当前节点
head = curr;
}
想当初一个单链表搞得我头晕,现在看来,都是很简单得东西,人们面对自己陌生的东西,第一次接触它,会觉得它好难好难,等到掌握到一定阶段,才发现并没有那么难,也许,我们都要经过,看山是山,看水是水,看山不是山,看水不是水的几个过程。
另外,附上,单链表带头节点的构造过程,想当初,第一次接触这个东西,我两周都反应不过来,可能脑子真的很迟钝。好笨哦,有什么办法呢?我想变聪明点,好了,不废话了。
//创建带头结点的链表
Node * Create_LinkNode()
{
Node *head = (Node*)malloc(sizeof(Node)),*curr = head;
Node *p = NULL;
char c;
while((c=getchar())!='\n')
{
p = (Node*)malloc(sizeof(Node));
p->num = c;
p->next = NULL;
curr->next = p;
curr = p;
}
return head;
}