一、递归逆置
通过递归得到尾指针的值,然后递归回去,每个结点指向其前驱。
linkList reverseList_1(linkList head){//递归逆置链表 ,需要用首元结点
if(head==NULL||head->next==NULL)return head;
linkList tail = reverseList_1(head->next);
head->next->next = head;
head->next = NULL;
return tail;
}
二、双指针
p指针作为current指针的前驱,每次利用next变量保存cur指针的下一个结点地址,cur指向p,p指向cur,cur指向next
void reverseList_2(linkList L){//双指针逆置链表
linkList p = L->next;
if(!p)return;
linkList cur = p->next;
p->next = NULL;
while(cur){
linkList next = cur->next;
cur->next = p;
p = cur;
cur = next;
}
L->next = p;
}
三、巧用头插
首先将链表断开,即孤立头结点,然后从p开始遍历结点,将结点顺次头插至头指针得到逆置的链表
void reverseList_3(linkList L){//尾插逆置
linkList p = L->next;
L->next = NULL;
while(p){
linkList t = p->next;
p->next = L->next;
L->next = p;
p = t;
}
}