链表翻转的图文讲解(递归与迭代两种实现)

本文详细介绍了链表翻转的非递归实现方法,并通过示例图解一步步展示了如何使用迭代方式实现链表的反转。从设置初始指针开始,到逐步调整每个节点的指向,最终完成整个链表的翻转。

链表的翻转是程序员面试中出现频度最高的问题之一
非递归(迭代)方式 
  迭代的方式是从链头开始处理,如下图给定一个存放5个数的链表。


这里写图片描述


  首先对于链表设置两个指针:


这里写图片描述


  然后依次将旧链表上每一项添加在新链表的后面,然后新链表的头指针NewH移向新的链表头,如下图所示。此处需要注意,不可以上来立即将上图中P->next直接指向NewH,这样存放2的地址就会被丢弃,后续链表保存的数据也随之无法访问。而是应该设置一个临时指针tmp,先暂时指向P->next指向的地址空间,保存原链表后续数据。然后再让P->next指向NewH,最后P=tmp就可以取回原链表的数据了,所有循环访问也可以继续展开下去。


这里写图片描述


  指针继续向后移动,直到P指针指向NULL停止迭代。


这里写图片描述


  最后一步:


这里写图片描述


非递归实现的程序

struct ListNode* reverseList(struct ListNode* head) {
    if(head==NULL||head->next==NULL)
        return head;
    
    struct ListNode *p=head;    //头节点给*P
    struct ListNode *newhead=NULL;
    while(p!=NULL)
    {
        struct node *tmp=p->next;  //暂存p的下一个地址
        {
            p->next=newhead;   //新链尾:p->next指向前一个空间
            newhead=p;        //新链表的头移动到p,扩长一步链表
            p=tmp;              //节点后移 p=p->next;
        }
    }
   return newhead;        
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值