带头结点链表就地逆置
基本思想:
将原链表分离为两个链表,一个head后带一个结点p,一个q带剩余结点
将q所在链表的每一个结点依次插入到head之后即可完成就地逆置
关键代码:
LinkList reverse(LinkList &head){//带头结点链表就地逆置
if(head==NULL){//空链表直接返回
return NULL;
}
LinkList p, q, l;
p = head->next;//将链表分离成两个链表,一个head后带一个结点p,一个q带剩余结点
q = p->next;
p->next = NULL;
while(q!=NULL){
l = q->next;
q->next = head->next;//将q插入到头结点之后
head->next = q;
q = l;//q向后移动
}
return head;
}
不带头结点链表就地逆置
基本思想:
将原链表拆分为两个链表,一个只有一个结点head,一个p带剩余结点
将p所在链表一次插入head之前(每次插入之后要调整head和p的位置)
关键代码:
LinkList Reverse(LinkList &head){
if(head==NULL){//空链表直接返回
return NULL;
}
LinkList p, q;
p = head->next;//将原链表拆分成两个链表,一个只有一个结点head,一个p带剩余结点
head->next = NULL;
while(p!=NULL){
q = p->next;
p->next = head;//将p插入head之前
head = p;//调整head位置
p = q;//调整p的位置
}
return head;
}