浙大陈越老师主编《数据结构》(第2版)学习笔记
例2.4 设计函数将链表L就地逆转
注:此例中单链表头节点是一个空节点,该节点的value空置,而next指向链表的第一个真正节点
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node_t * PtrToNode;
typedef struct Node_t
{
int value;
PtrToNode next;
}Node;
/* 构建链表:从头处插入 */
int create_list_by_insert_head(int* array, int array_len, PtrToNode* head)
{
int i;
PtrToNode tmp_head = NULL;
PtrToNode tmp_ptr = NULL;
if(array_len <= 0)
{
printf("Error: param error. len[%d] \n", array_len);
return -1;
}
else if(NULL == array || NULL == head)
{
printf("Error: param error. \n");
return -1;
}
tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
tmp_ptr->next = NULL;
tmp_head = tmp_ptr;
for(i = (array_len - 1); i >= 0; i--)
{
tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
tmp_ptr->value = array[i];
tmp_ptr->next = tmp_head->next;
tmp_head->next = tmp_ptr;
}
*head = tmp_head;
return 0;
}
/* 构建链表:从尾处插入 */
int create_list_by_insert_tail(int* array, int array_len, PtrToNode* head)
{
int i;
PtrToNode tmp_head = NULL;
PtrToNode tmp_tail = NULL;
PtrToNode tmp_ptr = NULL;
if(array_len <= 0)
{
printf("Error: param error. len[%d] \n", array_len);
return -1;
}
else if(NULL == array || NULL == head)
{
printf("Error: param error. \n");
return -1;
}
tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
tmp_ptr->next = NULL;
tmp_tail = tmp_ptr;
tmp_head = tmp_tail;
for(i = 0; i < array_len; i++)
{
tmp_ptr = (PtrToNode)calloc(1, sizeof(Node));
tmp_ptr->value = array[i];
tmp_ptr->next = NULL;
tmp_tail->next = tmp_ptr;
tmp_tail = tmp_ptr;
}
*head = tmp_head;
return 0;
}
int reverse_list(PtrToNode head)
{
int i;
PtrToNode old_head = NULL;
PtrToNode tmp_head = NULL;
PtrToNode tmp_ptr = NULL;
PtrToNode tmp_next = NULL;
if(NULL == head)
{
printf("Error: param error. \n");
return -1;
}
tmp_head = head;
old_head = head->next;
tmp_head->next = NULL;
/* 遍历旧链节点 */
while(NULL != old_head)
{
tmp_next = old_head->next;
/* 将旧链头部节点插入新链头部节点后 */
old_head->next = tmp_head->next;
tmp_head->next = old_head;
old_head = tmp_next;
}
}
void print_list(PtrToNode head)
{
PtrToNode tmp_ptr = head;
if(NULL == head)
{
printf("Error: param error \n");
return;
}
while(NULL != tmp_ptr->next)
{
tmp_ptr = tmp_ptr->next;
printf("%d ", tmp_ptr->value);
}
printf("\n");
return;
}
void free_list(PtrToNode head)
{
PtrToNode tmp_ptr = head;
PtrToNode tmp_next;
printf("free node: ");
while(NULL != tmp_ptr)
{
tmp_next = tmp_ptr->next;
free(tmp_ptr);
tmp_ptr = tmp_next;
}
printf("\n");
return;
}
int main()
{
int ret = 0;
int array[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0};
int array_len = sizeof(array) / sizeof(array[0]);
PtrToNode array_head1 = NULL;
PtrToNode array_head2 = NULL;
ret = create_list_by_insert_head(array, array_len, &array_head1);
if(0 != ret)
{
printf("Error: create_list_by_insert_head failed.\n");
return ret;
}
printf("list1: \n");
print_list(array_head1);
free_list(array_head1);
ret = create_list_by_insert_tail(array, array_len, &array_head2);
if(0 != ret)
{
printf("Error: create_list_by_insert_tail failed.\n");
return ret;
}
printf("list2: \n");
print_list(array_head2);
ret = reverse_list(array_head2);
if(0 != ret)
{
printf("Error: reverse_list failed.\n");
free_list(array_head2);
return ret;
}
printf("list after reverse: \n");
print_list(array_head2);
free_list(array_head2);
return 0;
}