/*单链表逆序的三种方法(递归、直接翻转指针、头插)*/
下文代码中的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://blog.csdn.net/v_xchen_v/article/details/53067448