力扣 剑指Offer 【反转链表】

题目描述:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
在这里插入图片描述

反转链表分为两种链表
1.有头节点
方法
1.1
头插法: 遍历整个链表,依次对所有节点进行头插,直到遍历完整个链表
1.2
迭代法:定义三个指针,遍历链表,并在访问各节点时修改 next 引用

2.没有头节点
而此题正属于没有头节点的题
方法
1.1
迭代法:定义三个指针,一个pre,一个p(指向当前节点),一个next(指向下一个节点),遍历链表,并依次修改next(这个只要把图画出来,就会很容易写出迭代的过程)
1.2
递归
要用递归解决问题的话,只要写出递归公式,问题就迎刃而解,我们首先先来分析,
1->2->3
我们要反转1->2这两个节点,前提是2->3这个问题已经解决,所以我们可以把整个(反转这个链表)问题分为
f(1) =f(2)+反转1->2
代码实现

迭代法:

      struct ListNode* reverseList(struct ListNode* head){
     struct ListNode * p =head;
     struct ListNode *pre =NULL;
     struct ListNode *next =NULL;
     while(p!=NULL){
         next=p->next;
         p->next=pre;
         pre=p;
         p=next;

     }
     return pre;
  

}

递归法:

struct ListNode * reverseList (struct ListNode * head){
    if(head == NULL||head->next==NULL ){
        return head;
    }
    struct ListNode * p =reverseList(head->next);
   head->next->next =head;
   head->next=NULL;
   return p;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值