链表逆置可以有很多种方法,
第一种方法,我们知道链表的创建的方法,有一种方法就是插头法,但是插头法有一个缺陷就是,如果你想输出的链表和你想要的顺序是一致的,你需要倒序输入,其实这就是链表的逆置。采用辅助指针,不断获取链表的第一个元素,然后用插头法创建一个新的链表,那么这个链表就是逆置的
void ListReverse_L(LinkList &L)
{
LNode *p,*tmp;
p = L->next;
L -> next = NULL;
while ( p)
{
tmp = p->next;
p->next = L->next;//后插法
L->next=p;//然后新链表的头结点指向p
p = tmp;
}
}
这个方法比较好理解,也是很方便。用处很大
第二种方法,递归
递归的方法也是比较好理解,不断去递归,当你递归到这个链表的最后一个元素的时候递归结束,然后不断把nextptr的next指向curptr 然后把curptr指向空结点就可以,
void reverseList_recur(ListNode *currPos)
{
// 空链表
if (currPos == nullptr)
return;
if (currPos->next == nullptr)
return;
ListNode *nextPos = currPos->next;
reverseList_recur(nextPos);
nextPos->next = currPos;//把下一个结点指前面的结点
currPos->next = nullptr;//把前面的结点指向为空
}
第三种方法,思路跟头插法差不多只是写法上不同,我认为比较难以理解,三种能够灵活掌握两种,就足够了
void reverse(Node *&head)
{
if (head == NULL || head->next==NULL) //空或者只有一个元素不用逆置
return;
Node *pre, *cur, *rear;
pre = head;
cur = head->next;
while (cur)
{
rear = cur->next;
cur->next = pre;
pre = cur;
cur = rear;
}
//以下两步,很重要
head->next = NULL; //这一步会使新的尾节点的链域置空
head = pre; //head指针指向新的一头
}