C语言单链表反转
思路部分
-
假设链表list有4个节点初始状态如下图
反转思路如下 -
第一次反转时,前面两个节点交换
- 第二次反转,把一开始的第一个节点连通其前面的节点替换掉其下个节点的位置,然后把被替换的节点移到前面。
通过前面的反转,可以找出规律,需要记录的共有三个节点:链表头,当前的第一个节点及一开始的第一个节点,之后按照规律实现需求。
代码部分
链表节点
// 单向链表节点
typedef struct node
{
int value; // 数据域
struct node *next; // 指向下个节点
}node;
具体实现(初步实现)
/**
* 功 能:单链表反转
* 参数1:链表头
* 返 回:成功返回0
* 思 路:链表头从第一个节点指到最后一个节点
*/
err_enum operate_reverse_list(node *list){
// 链表为空时返回
if (!list)
{
printf("null list\r\n");
return LIST_NON_EXITSTENT;
}
// 只有一个节点或0个节点时不需要反转
if (!list->next || !list->next->next)
{
printf("list need not reverse\r\n");
return OPERATE_SUCCESS;
}
// 链表头
node *list_head = list;
// 指向链表当前第一个节点
node *curr_frist_node = list->next;
// 指向链表反转后的最后一个节点
node *new_tail_node = list->next;
// 开始反转,只要下个节点不为空则继续
while (new_tail_node->next)
{
list_head->next = new_tail_node->next;
new_tail_node->next = list_head->next->next;
list_head->next->next = curr_frist_node;
curr_frist_node = list_head->next;
}
new_tail_node->next = NULL;
return OPERATE_SUCCESS;
}
结尾
写此文章用于记录学习点滴,以后需要时可以回顾。
写得有错误的地方或者可以改进的地方欢迎指出。