介绍两种单链表逆置的算法,头插法和递归法。
不说废话上代码。
typedef struct LNode{
int data;
struct LNode *next;
}LNode, *LinkList;
头插法
LinkList reverse(LinkList head)
{
LNode* temp = NULL,*Phead = NULL;
while (head != NULL) {
temp = head;
head = head->next;
temp->next = Phead;
Phead = temp;
}
return Phead;
}
现在说明一下头插法的原理
现在开始debug这个函数。
假设现在需要对 1->2->3->4->5->6->7 这个链表进行逆置
函数首先初始化了两个LNode 节点 temp和Phead
接下来就是循环
第一次循环
1->2->3->4->5->6->7 temp = head (将head的节点赋值给temp)
2->3->4->5->6->7 head = head->next (把head变为当前head的下一个节点)
NULL temp->next = Phead (因为第一次循环Phead = NULL 所有temp的下一个节点为空)
[1->NULL] temp(temp从1->2->3->4->5->6->7 变为 1->NULL 这里只是展示temp链表的变化)
[1->NULL] Phead = temp
第二次循环
2->3->4->5->6->7 temp = head
3->4->5->6->7 head = head->next
1->NULL temp->next = Phead
2->1->NULL temp
2->1->NULL Phead = temp
第三次循环
3->4->5->6->7 temp = head
4->5->6->7 head = head->next
2->1->NULL temp->next = head
3->2->1->NULL temp
3->2->1->NULL Phead = temp
依此类推
最终Phead 就会完成倒序 7->6->5->4->3->2->1
递归法
LinkList reverse_3(LinkList head){
if(head == NULL || head->next == NULL)
{
return head;
}
LinkList r_head = reverse_3(head->next);
head->next->next = head;
head->next = NULL;
return r_head;
}