潍坊市论坛

首页 » 分类 » 问答 » 数据结构与算法链表反转
TUhjnbcbe - 2021/3/29 18:15:00

题目描述

输入一个链表,反转链表后,输出新链表的表头。

解题思路:

1.递归思想:

公式:

head=head.next;

head.next.next=head;

2.迭代:

思路分析:

(1)将iter指向头节点的下个节点:iter=head.next;

(2)将头节点的下个节点指向res:head.next=res;

(3)将res指向头节点,完成res往后移动:res=head;

(4)将head指向iter,即完成head的往后移动:head=iter;

实现代码:

/*publicclassListNode{intval;ListNodenext=null;ListNode(intval){this.val=val;}}*/publicclassSolution{publicListNodeReverseList(ListNodehead){returnReverseListByIterator(head);}/*递归解法*/publicListNodeReverseListByRecruit(ListNodehead){if(head==null

head.next==null){returnhead;}ListNoderes=ReverseList(head.next);head.next.next=head;head.next=null;returnres;}/*迭代解法思路分析:将iter指向头节点的下个节点:iter=head.next;将头节点的下个节点指向res:head.next=res;将res指向头节点,完成res往后移动:res=head;将head指向iter,即完成head的往后移动:head=iter;*/publicListNodeReverseListByIterator(ListNodehead){if(head==null

head.next==null){returnhead;}ListNoderes=null,iter=null;while(head!=null){iter=head.next;head.next=res;res=head;head=iter;}returnres;}}预览时标签不可点收录于话题#个上一篇下一篇

TUhjnbcbe - 2021/3/29 18:15:00

“开年,我老婆携2万块进A股,今天我登录她账户,账上已有5万块,我蛮震惊的!
  

问:“你怎样做到的?” 

她说:“我前些日子又转进去8万。”

我们80后这代人大概是大一的时候学习C语言的,可能现在90后这一代也差不多,但是现在00后这一代人已经从小学,初中开始就学习C语言了。

笨叔在工作中发现,能熟练使用C语言的程序猿真的不多,大部分人都去玩Java,PHP,go,python等高级语言,像C这种时时刻刻需要和内存地址和指针做斗争的语言,显得太low。

下面是一个工作中的案例,这个案例和打了“真”的狂犬疫苗一样,程序乱跳,猴犀利!

小明同学想在Qemu中实现一个裸机系统,依葫芦画瓢定义了一个task_struct数据结构。按照Linux内核的实现,在系统第一个进程的task_struct数据结构,那么这进程的栈是在task_struct数据结构的8KB大小的顶部。如这个图所示。

小明同学三下五除二在main.c文件中实现了init_task,如下面所示。

staticstructtask_structinit_task=INIT_TASK;

#defineINIT_TASK\

{\

  .state=-1,\

  .counter=0,\

  .priority=1,\

  .preempt_count=0,\

  .flags=PF_KTHREAD,\

  .pid=0,\

}

定义完init_task之后,小明同学接下来按照上面这个图,想当然来实现一个“神来之笔”的访问,来获取当前进程的栈框(stackframe)。

structpt_regs*

get_current_pt_regs(structtask_struct*tsk)

{

  unsignedlongp;

p=(unsignedlong)tsk+THREAD_SIZE-

    sizeof(structpt_regs);

  return(structpt_regs*)p;

}

自从小明实现和调用这函数之后,他的程序再也没有正常过,不是出现“Dataabort”异常,就是程序乱跑,和打了“真”的狂犬疫苗一样。笨叔和小明同学说,你学Linux内核的代码实现,只看到了皮毛,还需要继续深入学习C语言哟!

大家看看小明同学的代码出现是啥毛病吗?你们有答案了,别忘了在评论区留言哟!

[往期精彩]

[笨叔点滴1]为什么do_page_fault函数里代码需要判断用户态还是内核态?

[笨叔点滴2]为啥子ARM32体系结构中每个处理模式都有一个单独的栈?

[笨叔点滴3]“栈”谁便宜了?

[笨叔点滴4]“栈”谁便宜了2

[笨叔点滴5]gitrebase和gitmerge究竟有啥区别?

[笨叔点滴6]叔,这个git咋玩啊?

LinuxCon北京游记(1)

LinuxCon北京笨叔笨游记2

《奔跑吧linux内核》配套资源迁移到码云上

考点来了:4月18号视频更新

代码导读之如何使用qemu来单步调试head.S

代码导读之内存管理初始化-启动汇编

视频更新:内存管理代码框架导读

DMA那些事儿

私密VIP群答疑

高级运维必杀技:如何图形化单步调试RHEL/Centos7里的内核?

首发:Meltdown漏洞分析与实践

[奔跑吧Linux内核]故乡

致敬Beyond

小笨叔

1
查看完整版本: 数据结构与算法链表反转