单链表的逆置
方法一:头插
void Reverse(Node* plist) {
assert(plist != NULL&&plist->next!=NULL);
Node* p = plist->next;
Node* q;
plist->next = NULL;
while (p != NULL) {
q = p->next;
p->next = plist->next;
plist->next = p;
p = q;
}
}
方法二: 通过三个指针不借助头节点
定义三个指针分别指向头节点后的三个元素
再将 p->next =NULL;
进行循环
使q->next = p; 改变指针指向
再将p q r 三个指针同时向后移动
直至q为NULL 再将plist (头节点)指向p 即可
void Reverse1(Node* plist) {
assert(plist != NULL && plist->next != NULL);
Node* p = plist->next;
Node* q = p->next;
Node* r;
p->next = NULL;
while (q != NULL) {
r = q->next;
q->next = p;
p = q;
q = r;
}
plist->next = p;
}
单链表的逆置 (首元素节点与尾元素节点不变其余节点逆置)
单链表逆置的变种 :
这里采用方法一
定义四个节点,z保存 头节点和首元素节点
r节点保存要第二个元素节点的地址
p 和 q节点进行头插操作
完整代码
void Reverse01(ListNode* plist) { //首节点和尾节点不变
//assert
ListNode* z = plist->next;
ListNode* p = z->next;
ListNode* q=NULL;
ListNode* r = p;
z->next = NULL;
while (p->next!= NULL) {
q = p->next;
p->next = z->next;
z->next = p;
p = q;
}
r->next = p;
}
图解
while前操作
while循环结束 (中间节点逆置完成)
最后将r指向p节点即可