用递归实现链表反转时,每次只考虑两个节点的反转就可以了,实现起来清晰很多。
下面给出链表的数据结构
typedef struct ListNode{
int data;
struct ListNode* next;
}LIST_NODE;
typedef struct List{
LIST_NODE *head;
LIST_NODE *tail;
int size;
}LIST;
分
主要分两个步骤:
一:反转链表
二:交换头尾指针指向
void list_reverse(LIST *list)
{
LIST_NODE *temp;
//反转链表
reverse(list->head);
//交换头尾指针
temp = list->head;
list->head = list->tail;
list->tail = temp;
}
主要思想在于如何反转链表:
思考只有两个节点时,怎么反转 ,前节点 firstNode 后节点:secondNode
secondNode->next = firstNode;
firstNode->next = NULL;
即可。
下面直接贴代码
void reverse(LIST_NODE *head)
{
if(head && head->next)//当至少有两个节点,才进行交换。退出递归条件也就是遇到最后一个节点
{
reverse(head->next);//
head->next->next = head;
head->next = NULL;
}
}
递归比较奇怪,有时候只需要相信它能完成任务就可以很轻松的写出代码。但是要一步一步的分析怎么运行,反倒不好讲了。
只能这样留个大概思路吧。