头插法实现链表反转

以包含四个元素、带有头结点的链表l为例:

head->a1->a2->a3->a4;

保持头结点不变,头插法实现链表反转步骤为:

1: 将a2插在a1前面,该链表变为:

head->a2->a1->a3->a4;

2: 将a3插在a2前面,该链表变为:

head->a3->a2->a1->a4;

2: 将a4插在a3前面,该链表变为:

head->a4->a3->a2->a1

可以发现,此时已经完成了链表的反转。

仔细观察,该方法可抽象为:

head->p->...->q->t->...->尾节点

即:每次将q节点插入首个节点p的前面。为了进行下次操作,我们还需要在插入前记录下q后面节点t。

当q为空时,该方法结束,此时完成了整个链表的反转。最后,记得将头结点head指向反转后的首个节点p,

同时将反转后的尾节点的next指针设为空。

C++实现:

/*

struct MyList{
int val;
struct MyList * next;
MyList(int n,MyList * Next):val(n),next(Next){}
};

*/

bool ReverseList2(MyList * l){
MyList * head = l;
l = l->next;
MyList * FirstOri = l;
if(!l)
return head;
MyList * p,*q,*t;
p = l;
q = p->next;
t = NULL;
while(q)
{
t = q->next;
q->next = p;
p = q;
q = t;
}
head->next = p;
FirstOri->next = NULL;
return true;
}

ps:除了上述方法外,尝试过先记录每个节点位置,然后更改每一个节点next的值,

使它指向原链表的前一个节点。实现后发现,需要循环的次数太多,但是方法比较直观。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值