项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.反转链表

反转链表在面试中非常常见。例如:
将原链表:
0->1->2->3
反转为新链表:
3->2->1->0
反转链表的一般思路是使用三个指针。其中,一个指针为当前节点,一个指针指向当前节点的下一个节点,另外一个节点则指向新链表表头从而保存结果。

public class Reversed_MyLinkedList {public static Node reversed_linkedlist() {MyLinkedList list = new MyLinkedList();Node head = list.init();if(head == null || head.next == null) {return head;}//使用三个节指针Node current = head;Node newHead = null;Node next = null;while(current != null) {//先将当前节点的下个节点保存next = current.next;current.next = newHead; //将原来的链表断链,将current的下一个结点指向新链表的头结点newHead = current; //将current设为新表头current = next; //将之前保存的next设为下一个节点}return newHead;}public static void main(String[] args) {MyLinkedList list = new MyLinkedList();Node head = reversed_linkedlist();System.out.println("After reversed, the list is: ");list.print(head);}
}

其中MyLinkedList,Node类的代码见http://blog.csdn.net/bitcarmanlee/article/details/52155181。

18-23行的逻辑描述如下:假设原链表有三个节点l,m,n,指向关系为l->m->n。当遍历到m节点时,此时有current=m,newHead=l。先用next指针保存n节点,然后将current.next指针指向newHead,此时m的next指针变为newHead即为l。接着,将newHead指针设为current,即此时newHead指针变为m。最后,将current指针变为先前保存的next指针即为n。等到下一次循环的时候,通过current.next = newHead这句将节点n的next指针设为m。通过整个过程,三个节点的指向关系就变为了n->m->l。

将上面的代码run起来

After reversed, the list is:
9 8 7 6 5 4 3 2 1 0

2.从尾到头倒序遍历链表

方法1:采用递归的方式
方法2:对于这种倒序的要求,我们很自然想到"后进先出",很自然就想到用栈这种数据结构去模拟整个倒序遍历的过程。

直接上代码

import java.util.Stack;public class Reverse_Travel_LinkedList {//递归public static void rev_tra_recur(Node head) {if(head == null) {return;}rev_tra_recur(head.next);System.out.print(head.data + " ");}//非递归,用栈模拟public static void rev_tra_no_recur(Node head) {if(head == null) {return;}Stack<Node> stack = new Stack<Node>();Node current = head;while(current != null) {stack.push(current);current = current.next;}while(!stack.isEmpty()) {System.out.print(stack.pop().data + " ");}}public static void main(String[] args) {MyLinkedList list = new MyLinkedList();Node head = list.init();rev_tra_recur(head);System.out.println();rev_tra_no_recur(head);}
}

将代码run起来

9 8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

由此可见,两种方法都能很好地满足我们的要求。
递归的好处是代码量少,简介明了。但是所有递归都有的毛病就是当递归次数太多的时候,会导致方法调用的层级很深,最终导致内存不够栈溢出。所以如果从代码的稳定性考虑的话,非递归的方式显然要更安全一些。

链表常见操作java实现二:反转链表,从尾到头倒序遍历相关推荐

  1. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  2. java实现单链表常见操作

    一.概述: 本文主要总结单链表常见操作的实现,包括链表结点添加.删除:链表正向遍历和反向遍历.链表排序.判断链表是否有环.是否相交.获取某一结点等. 二.概念: 链表: 一种重要的数据结构,HashM ...

  3. 在单链表写入一组数据代码_链表常见操作和15道常见面试题

    什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样 ...

  4. C语言——带头节点单链表常见操作

    #include <stdio.h> #include <stdlib.h> typedef struct stu {int data; //存放数据struct stu* n ...

  5. 24. 两两交换链表中的节点-两两反转链表-LeetCode

    一.题目 二.思路 1.采用递归的方式 2.可以通过递归的方式实现两两交换链表中的节点. 递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换. 如果链表中至少有两个节点,则在两两 ...

  6. 剑指Offer - 面试题6. 从尾到头打印链表(栈,递归,反转链表)

    文章目录 1. 题目 2. 解题 2.1 stack解题 2.2 递归 2.3 反转链表 1. 题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head ...

  7. java静态链表_用Java实现一个静态链表

    什么是静态链表? 对于线性链表,也可用一维数组来进行描述.这种描述方法便于在没有指针类型的高级程序设计语言中使用链表结构. 用数组描述的链表,即称为静态链表. 在C语言中,静态链表的表现形式即为结构体 ...

  8. python字典操作添加_Python字典常见操作实例小结【定义、添加、删除、遍历】

    本文实例总结了python字典常见操作.分享给大家供大家参考,具体如下: 简单的字典: 字典就是键值对key-value组合. #字典 键值对组合 alien_0 ={'color':'green', ...

  9. 【算法面试必刷JAVA版二】链表内指定区间反转

    盲目刷题,浪费大量时间,博主这里推荐一个面试必刷算法题库,刷完足够面试了.传送门:牛客网面试必刷TOP101

  10. c语言单链表数据显示,C++_C语言单链表常见操作汇总,C语言的单链表是常用的数据结 - phpStudy...

    #include #include //定义单链表结构体 typedef int ElemType; typedef struct Node { ElemType data; struct Node ...

最新文章

  1. 第五章 处理器拦截器详解——跟着开涛学SpringMVC
  2. vbs复制自身到启动文件夹
  3. Spring配置Bean的方式
  4. 计算机组装大赛队名,比赛项目设计及评分标准-中国海员技能大比武.DOC
  5. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:设置浮动和偏移
  6. Magento 添加 google font Adding a google fonts into Magento
  7. SQL Server字符串左匹配
  8. python数据分析numpy_Python数据分析之numpy学习(一)
  9. C语言实现约瑟夫环代码
  10. 相乘函数计算机表示符号,excel乘积函数_excel相乘函数使用方法
  11. ASP.NET 新闻发布网站
  12. 投影幕布尺寸计算器_投影幕尺寸是怎么算的
  13. 汇编语言小写字母转大写字母
  14. 云计算与大数据复习题
  15. 2021年如何折腾小米平板2,装上win11
  16. pr 调整图层缩放移动无效
  17. LeetCode_二分图_中等_785. 判断二分图
  18. 降龙十八掌-程序员篇
  19. kol营销推广 | 达人营销,如何精准且快速找达人?
  20. 华为设备配置PIM-SM命令

热门文章

  1. Git基础之(十五)——分支管理——分支管理策略
  2. Selenium如何处理类悬浮弹出菜单
  3. 学习了1!+...10!
  4. 用C#实现***程序
  5. sourceTree外部工具解决冲突
  6. redis应用场景与最佳实践
  7. Instant Run requires 'Tools | Android | Enable ADB integration' to be enabled.
  8. 在不同浏览器都实用的各窗口大小获取方法
  9. 玩Elastix遇到的几个问题和解决办法。
  10. jQuery API/1.1.1/CSS