逆置单链表的两种方法
一、无限头插
1)申请两个指针p和q,p用来指向第一个有效节点,q先赋值为NULL
2)把辅助节点的next置为NULL
3)进入while()循环,循环条件是p指向的节点存在
4)通过p和q的配合,让p指向的节点头插到plist指向的辅助节点后面
void Reverse1(Node* plist)
{assert(plist != NULL);//确保最少有两个有效节点才需要逆置 if (plist->next == NULL || plist->next->next == NULL){return;}Node* p = plist->next;Node* q = NULL;plist->next = NULL;while (p != NULL){q = p->next;p->next = plist->next;plist->next = p;p = q;}
}
二、不借助辅助节点的参与,使用三个指针
1)将辅助节点扔到一边去(不借助它)
2)申请3个指针p,q,r,分别让p先指向第一个有效节点,让g指向第二个有效节点,再让r先赋值为NULL
3)进入while循环,循环条件是 q 不为NULL
4)立马把q的next给到r,然后逆置p和q之间的箭头,也就是让q的next保存p的地址
5)再让p同步到q的位置,再让q同步到r的位置
6)当while循环结束,代表着所以有效节点之间的next已修正完成(箭头指向),这时只需要让最初的辅助节点把此时q指向的节点指向即可
void Reverse2(Node* plist)
{assert(plist != NULL);if (plist->next == NULL || plist->next->next == NULL){return;}Node* p = plist->next;Node* q = p->next;Node* r = NULL;p->next = NULL;while (q != NULL){r = q->next;q->next = p;p = q;q = r;}plist->next = p;
}