1.链表反转
大家有没有过将链表反转的想法,与数组反转不同的是这里的反转后是将每个节点的地址白村反过来,当然也可以遍历链表然后从尾节点开始尾插到新链表中,然后将新链表的头结点返回即可。我们今天要学的是第一个方法。当然第二个想法也没问题,只不过第一种想法较为高级一些。
代码实现:
ListNode* reverseList(ListNode* phead)
{
//处理空链表
if (phead == NULL)
{
return phead;
}
//创建三个指针
ListNode* n1, *n2, *n3;
n1 = NULL, n2 = phead, n3 = phead->next;
while (n2)
{
//修改n2的指向
n2->next = n1;
//修改三个指针的位置
n1 = n2;
n2 = n3;
if (n3)
{
n3 = n3->next;
}
}
return n1;//此时n1刚好为新链表的头节点
}
我们可以看到我们创建了三个指针,分别指向第一个节点,和下一个节点,我们通过判断n2是否为空,来控制循环,此时n1就来到了原链表的尾节点,通过更改节点们的指针域来改变节点的指向。此时原链表就达到了意义上的反转,大家可能会问为啥不是使用二级指针,因为我们我们只是改变其指针域,并不改变节点的数据。当然n1=NULL,是为了方便打印链表时停下。我们也可以在打印是加上->来使其更好理解。
我们来试试: