步骤一:
从首节点开始为Back节点、Back节点的下一个节点为pointer节点,若Back节点是首节点,则将Back节点的指针设为NULL;
Back = head;
pointer = back->next;
Back->next = NULL;
从下一个节点(Next节点)设为pointer节点的指针,将pointer节点的指针指向上一个节点(Back节点),Back节点设为pointer节点,pointer节点设为下一个节点(Next节点)。
Next = pointer->next;
pointer->next = Back;
Back = pointer;
pointer = Next;
步骤二:
下一个节点设为pointer节点指针,将pointer节点的指针指向上一个节点,上一个节点设为pointer节点,pointer节点设为下一个节点。
Next = pointer->next;
pointer->next = Back;
back = pointer;
pointer = Next;
重复步骤二,直到pointer节点的指针指向NULL为止。
步骤三:
将pointer节点的指针指向上一个节点,首节点的head节点设为pointer节点
pointer->next = Back;
head = pointer;
例:设计一个反转链表的程序
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
struct List
{
int number;
int total;
struct List *next;
};
typedef struct List Node;
typedef Node *Link;
int data[2][MAX] = {1, 3, 5, 7, 2, 4, 6, 8, 9, 0, 15, 35, 20, 23, 33, 45, 55, 56, 15, 10};
/***********************
* 反转链表
***********************/
Link invert_list(Link head)
{
Link pointer; //节点声明
Link back; //上一个节点
Link next; //下一个节点
back = head; //back指针设为首节点
pointer = back->next;
back->next = NULL;
next = pointer->next;
pointer->next = back;
back = pointer;
pointer = next;
while(pointer->next != NULL) //当到达链表尾端时,结束循环
{
next = pointer->next;
pointer->next = back;
back = pointer;
pointer = next;
}
pointer->next = back;
head = pointer;
return head;
}
/***********************
* 输出链表
***********************/
void print_list(Link head)
{
Link pointer;
pointer = head;
while(pointer != NULL)
{
printf("[%d, %d]", pointer->number, pointer->total);
pointer = pointer->next;
}
printf("\n");
}
/***********************
* 销毁链表
**********************/
void free_list(Link head)
{
Link pointer;
while(head != NULL)
{
pointer = head;
head = head->next;
free(pointer);
}
}
/***********************
* 建立链表
***********************/
Link create_list(Link head)
{
Link new;
Link pointer;
int i;
head = (Link)malloc(sizeof(Node));
if(head == NULL)
{
printf("Memory allocate failure!\n");
}
else
{
head->number = data[0][0]; //定义首节点数据编号
head->total = data[1][0];
head->next = NULL;
pointer = head; //pointer指针设为首节点
for(i = 0; i < MAX; ++i)
{
new = (Link)malloc(sizeof(Node));
new->number = data[0][i];
new->total = data[1][i];
new->next = NULL;
pointer->next = new; //将新节点串联在原列表尾端
pointer = new; //列表尾端节点为新节点
}
}
return head;
}
int main()
{
Link head;
head = create_list(head);
if(head != NULL)
{
printf("Input data: \n");
print_list(head); //
head = invert_list(head); //调用反转
printf("after invert: \n");
print_list(head);
free_list(head);
}
}