剑指offer 15

1 篇文章 0 订阅
1 篇文章 0 订阅

反转链表
题目描述
输入一个链表,反转链表后,输出新链表的表头。
示例1
输入
复制
{1,2,3}
返回值
复制
{3,2,1}

思路:
1.头插法实现,使用三个指针,pre now tmp(now的下一个)
pre->next=tmp;
now->next=head;
head=now;
这样实现一次头插

1.1初始化是pre指向null
第一次插入其实和不插入一样,所以,第一次循环,只要要移动指针,不需要插入。(这样其实在情况2中会出错,具体看情况二)

 if(pre==NULL){ 
                pre=now;
                now=tmp;
                tmp=now->next;
                continue;
            }

1.2对于非第一次循环

            //pre和tmp相连(把now的节点从链中断开)
            pre->next=tmp;
            
            //now移到pHead前面
            now->next=pHead;
            
            //pHead指向now
            pHead=now;
            
           //如果下一个已经是NULL 了则不能移动指针了,直接break 
            if(tmp==NULL)
                break;
            
            //pre不变
            pre=pre;
            
            //now指向tmp
            now=tmp;
            
            //如果now的下一个节点不等于NULL
            if(now->next!=NULL)
                tmp=now->next;
            else 
                tmp=NULL;

2.特殊情况1:空链表
直接返回phead
3.特殊情况2:链表中只有一个值

  if(pre==NULL){ //这个情况就是now指向了第一个值,不需要倒插,直接移动指针
       pre=now;
       now=tmp;
       if(now!=NULL)//如果链表只有1个值,移动指针后now就是NULL,那直接返回pHead
           tmp=now->next;
       else
           return pHead;
       continue;
   }

代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        if(pHead==NULL){
              return pHead;
        }

        ListNode* t=pHead;
        ListNode* pre=NULL;
        ListNode* now=pHead;
        ListNode* tmp=pHead->next;
        while(1){
            if(pre==NULL){ //这个情况就是now指向了第一个值,不需要倒插,直接移动指针
                pre=now;
                now=tmp;
                if(now!=NULL)//如果链表只有1个值,移动指针后now就是NULL,那直接返回pHead
                    tmp=now->next;
                else
                    return pHead;
                continue;
            }
            //pre和tmp相连(把now的节点从链中断开)
            pre->next=tmp;
            
            //now移到pHead前面
            now->next=pHead;
            
            //pHead指向now
            pHead=now;
            
            
            if(tmp==NULL)
                break;
            
            //pre不变
            pre=pre;
            
            //now指向tmp
            now=tmp;
            
            //如果now的下一个节点不等于NULL
            if(now->next!=NULL)
                tmp=now->next;
            else 
                tmp=NULL;
            
        }       
        return pHead;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理的内容越多,也需要更多的人来对数据进行整理,并且数据的汇总查询方面效率也是极其的低下,并且数据安全方面永远不会保证安全性能。结合数据内容管理的种种缺点,在互联网时代都可以得到有效的补充。结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。本次开发的医院后台管理系统实现了病房管理、病例管理、处方管理、字典管理、公告信息管理、患者管理、药品管理、医生管理、预约医生管理、住院管理、管理员管理等功能。系统用到了关系型数据库中王者MySql作为系统的数据库,有效的对数据进行安全的存储,有效的备份,对数据可靠性方面得到了保证。并且程序也具备程序需求的所有功能,使得操作性还是安全性都大大提高,让医院后台管理系统更能从理念走到现实,确确实实的让人们提升信息处理效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值