方法一:头插法(两个指针)
代码:
//逆转带头链表,头插法
LinkList Reverse(LinkList &L){
LNode *p,*q;//p为工作指针,q为p的后继
p=L->next;
L->next=NULL;
while(p!=NULL) {//依次摘下节点
q=p->next;//暂时存p的后继
p->next=L->next;//将p节点插入到头节点之后
L->next=p;
p=q;
}
return L;
}
时间复杂度O(n);空间复杂度O(1)
方法二:三个指针(类似尾插法)
代码:
//逆转带头单链表,三指针,类似尾插法
LinkList Reverse(LinkList &L){
LNode *p,*q=L->next,*r=q->next;
q->next=NULL;//处理第一个节点
while(r!=NULL){//r不为空,说明q面还有节点
p=q;
q=r;
r=r->next;
q->next=p;//反转指针
}
L->next=q;//处理最后一个节点
return L;
}
时间复杂度O(n);空间复杂度O(1)
方法三:利用栈的先进后出
代码:
struct ListNode* reverseList(struct ListNode* head){
if(head==NULL){
return NULL;
}
struct ListNode* p=head;
int size=0;
while(p != NULL){//计算链表长度
size++;
p=p->next;
}
struct ListNode* stack[size];
int top=-1;
p=head;
while(p != NULL){//进栈
stack[++top]=p;
p=p->next;
}
struct ListNode* head1=stack[top];
p=head1;
while(top != -1){//出栈
p->next=stack[top--];
p=p->next;
}
p->next=NULL;
return head1;
}
时间复杂度:O(n);空间复杂度O(n)