当前位置: 首页 > news >正文

网站建设 无锡/做网络推广的公司

网站建设 无锡,做网络推广的公司,wordpress登陆页美化,网页表白在线制作前言:单链表的反转、合并两个有序链表和倒序打印链表等算法,是各大公司Java面试开发中常考的题目。 一、单链表反转 算法思想:所谓的单链表反转,就是把每个节点的指针域由原来的指向下一个节点变为指向其前一个节点。 由于单链…

前言:单链表的反转、合并两个有序链表和倒序打印链表等算法,是各大公司Java面试开发中常考的题目。

一、单链表反转

算法思想:所谓的单链表反转,就是把每个节点的指针域由原来的指向下一个节点变为指向其前一个节点。

由于单链表没有指向前一个节点的指针域,因此我们需要增加一个指向前一个节点的指针pre,用于存储每一个节点的前一个节点。此外,还需要定义一个保存当前节点的指针cur,以及下一个节点的temp。定义好这三个指针后,遍历单链表,将当前节点的指针域指向前一个节点,之后将定义三个指针往后移动,直至遍历到最后一个节点停止。
 

核心:将当前节点cur的下一个节点 cur.next缓存到temp后,然后才更改当前节点指针指向上一结点pre。也就是说在反转当前结点指针指向前驱结点时,先把当前结点的指针域用tmp临时保存,以便下一次使用。

  •    pre:上一结点,置为null避免打印出原头结点数据

  •    cur: 当前结点

  •    tmp: 临时结点,用于保存当前结点的指针域(即下一结点)

遍历反转法:从前往后反转各个结点的指针域的指向。

public static Node reverseChain(Node head) 
{if(head.next==null){System.out.println("链表为空");return head;}Node pre = null;//前驱节点Node cur = head.next;//当前结点Node temp = null;//临时结点,保存当前结点的下一结点,方便移动while(cur!=null)  //结点为null时,说明位于尾结点{//反转当前结点指针指向前驱结点时,先把当前结点的指针域用tmp临时保存,以便下一次使用。temp = cur.next;cur.next = pre;//反转指针域的指向// 指针往下移动pre = cur;cur = temp;}// 最后将原链表的头节点置为null(否则会打印出原表数据),返回新链表的首元结点,即原链表的尾结点head.next = null;return pre;}

二、合并两个有序链表

例如:

链表1:

  1->2->3->4

链表2:

  2->3->4->5

合并后:

  1->2->2->3->3->4->4->5

算法思想:与合并两个有序数组类似,挨着循环比较两链表,较小元素放入新链表。

//两个参数代表的是两个链表的头结点
public Node mergeLinkList(Node head1, Node head2) 
{if (head1 == null && head2 == null) {  //如果两个链表都为空return null;}if (head1 == null) {return head2;}if (head2 == null) {return head1;}Node head; //新链表的头结点Node current;  //current结点指向新链表// 一开始,我们让current结点指向head1和head2中较小的数据,得到head结点if (head1.data < head2.data) {head = head1;current = head1;head1 = head1.next;} else {head = head2;current = head2;head2 = head2.next;}while (head1 != null && head2 != null) {if (head1.data < head2.data) {current.next = head1;  //新链表中,current指针的下一个结点对应较小的那个数据current = current.next; //current指针下移head1 = head1.next;} else {current.next = head2;current = current.next;head2 = head2.next;}}//合并剩余的元素if (head1 != null) { //说明链表2遍历完了,是空的current.next = head1;}if (head2 != null) { //说明链表1遍历完了,是空的current.next = head2;}return head;
}

三、倒序打印链表

前面我们已经学了反转单链表的算法,貌似直接打印出来即可,但是这样会破坏原有链表结构,故不推荐。

对于这种颠倒顺序的问题,我们应该就会想到栈,后进先出。所以,这一题要么自己使用栈,要么让系统使用栈,也就是递归

①自己新建一个栈

//方法:从尾到头打印单链表public void reversePrint(Node head) {if (head == null) {return;}Stack<Node> stack = new Stack<Node>();  //新建一个栈Node current = head.next;//将链表的所有结点压栈while (current != null) {stack.push(current);  //将当前结点压栈current = current.next;}//将栈中的结点打印输出即可while (stack.size() > 0) {System.out.println(stack.pop().data);  //出栈操作}}

②递归法:

public void reversePrint(Node head)
{if (head == null) return;reversePrint(head.next);System.out.println(head.data);
}

总结:方法2是基于递归实现的,代码看起来简洁优雅,但有个问题:当链表很长的时候,就会导致方法调用的层级很深,有可能造成栈溢出。而方法1的显式用栈,是基于循环实现的,代码的鲁棒性要更好一些。

 

参考链接:链表面试题Java实现

 

http://www.lbrq.cn/news/1390969.html

相关文章:

  • 有做美食的视频网站么/成人短期培训学校
  • php 网站cookie/搜索引擎yandex入口
  • 深圳高端网站建设/做营销怎样才能吸引客户
  • 网站的用户体验/网站关键词排名手机优化软件
  • 怎样给自己的店做网站/学it一年的学费大概是多少
  • 比较多人用什么网站做推广/世界球队最新排名
  • 哪家做的濮阳网站建设/石家庄百度快照优化
  • 怎么创建万维网网站/seo网站优化技术
  • 做海报的网站有哪些内容/什么是淘宝seo
  • 姜堰区网站建设/优化排名推广技术网站
  • 报告编号怎么获取/seo实战培训费用
  • 美女做爰免费观看视频网站/手机优化软件
  • 爱剪辑/seo关键词排名报价
  • 广州web网站开发培训班/移动端关键词排名优化
  • 地接做的网站/网奇seo培训官网
  • 钻石网站建设/seo推广优化平台
  • 蓝德网站建设/电话销售如何快速吸引客户
  • wordpress登录搜索/临沂seo整站优化厂家
  • 台州网站外包/设计公司排名
  • 大莲网站建设公司/自己做的网站怎么推广
  • 做彩票网站能挣到钱吗/免费网站的平台
  • 做淘宝客网站教程/百度文库网页版
  • 知名b2b网站/软文撰写案例
  • 中国能建设计公司网站/站长之家产品介绍
  • 全是图片的网站怎么做seo/山西seo优化公司
  • 网站建设对宣传的意义/淘宝关键词搜索量排名
  • 宁波做网站的专业公司/搜狗链接提交入口
  • 高端网站建设设计公司/seo优化方案案例
  • 石家庄+外贸网站建设公司/百度资源分享网页
  • 网站在线qq客服代码/企业内训
  • 开源 python 应用 开发(十一)短语音转文本
  • 活性数据处理与标准化
  • linux 差分升级简介
  • 如何使用Prometheus + Grafana + Loki构建一个现代化的云原生监控系统
  • CAMEL-Task1-CAMEL环境配置及你的第一个Agent
  • InnoDB为什么使用B+树实现索引?