今天找一个链表问题时,动手用c语言实现了下,不多说直接上代码
/*
0 2 4 6 8
8 6 4 2 0
Press any key to continue
*/
#include <stdio.h>
#include <stdlib.h>
#define ELTYPE int
typedef struct node {
ELTYPE m;
struct node *next;
} *NODE;
void InversionNode(NODE head) {
NODE p,t,q;
p = NULL;
t = head->next;
q = t->next;
if(t == NULL || q == NULL) return; // 空表和仅有一个结点的链表不用倒置
while(q) {
t->next = p; // 倒置结点
p = t; // p指向新倒置的结点
t = q; // 前进一个结点
q = q->next;
}
t->next = p; // 处理最后一个结点
head->next = t; // head指向倒置后的链表
}
void ShowNode(NODE head) {
NODE p = head->next;
for(;p;p = p->next) printf("%d ",p->m);
printf("\n");
}
NODE CreatNode(int n) { // 创建有头结点的单向链表
int i;
NODE head,p,q;
head = p = (NODE)malloc(sizeof(NODE));
for(i = 0; i < n; ++i) {
q = (NODE)malloc(sizeof(NODE));
q->m = 2 * i;
p->next = q;
p = q;
}
p->next = NULL;
return head;
}
int main() {
NODE head = CreatNode(5);
ShowNode(head);
InversionNode(head);
ShowNode(head);
return 0;
}
主函数里面,先创建一个链表,实现反转,再打印链表。创建链表、打印部分不难,接下来重点说说
反转算法,上个图各位就明白了:
-----------------------------------------------------------------------------------------------
使用p和q两个指针配合工作,使得两个节点间的指向反向,同时用r记录剩下的链表。
![](http://hi.csdn.net/attachment/201110/2/0_1317565566SEbH.gif)
![](http://hi.csdn.net/attachment/201110/2/0_13175657179L43.gif)
![](http://hi.csdn.net/attachment/201110/2/0_1317565777WHOA.gif)
-----------------------------------------------------------------------------------------------