转载链接:https://blog.csdn.net/biqioso/article/details/82951283
单链表逆序的三种方法(递归、直接翻转指针、头插)
下文代码中的list_head 结构体为链表节点结构体。
递归方法
struct list_head *reverse(struct list_head *head)
{
struct list_head *new_head;
/*判断异常 || 结束判断*/
if (!head || !head->next) /*边界条件*/
return head;
new_head = reverse(head->next);/*递归部分*/
head->next->next = head; /*溯回部分*/
head->next = NULL; /*记得要赋值为NULL,防止链表错乱*/
return new_head; /*返回新的链表头*/
}
直接翻转指针
struct list_head *reverse(struct list_head *head)
{
struct list_head *prev = NULL;
struct list_head *next;
while (head != NULL) {
next = head->next;
head->next = prev;
prev = head;
head = next;
}
return prev;
}
头插法
struct list_head *reverse(struct list_head *head)
{
struct list_head *z, *j;
j = head->next; /*j用来保存下一个要翻转的结点*/
head->next = NULL; /*这里相当于把链表头与链表的其余\
部分断开,作为新的链表头*/
while (j != NULL) {
z = j;
j = j->next;
z->next = head->next;
head->next = z;
}
return head;
}
这是我的博客,喜欢技术,喜欢头脑风暴,欢迎交流博客园:https://www.cnblogs.com/live-passion/
参考文章:https://blog.csdn.net/v_xchen_v/article/details/53067448