剑指offer面试题16:反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点。
解题思路:单向链表只能实现单向遍历,改变链表方向就是要把当前链表的节点指向它的前一个节点,
一旦当前链表指向发生了变化,就不能根据此节点获取到它后面的节点,所以在改变方向前要保存当前节点的下一节点,防止链表断开,
因此需要三个指针来保存当前节点,当前节点的前节点,当前节点的下节点。
注意:如果当前节点没有下一节点,则此节点就是反转后的链表的头结点。
另外一种解决办法是使用一个栈结构,顺序遍历链表,把每个节点依次入栈。待全部节点入栈后,依次把节点从栈中取出并连接,这样得到的链表也是反转后的链表。
package Solution;
public class No16ReverseList {
public static class ListNode {
int data;
ListNode next;
public ListNode() {
}
public ListNode(int value, ListNode next) {
this.data = value;
this.next = next;
}
}
public static ListNode reverseList(ListNode head) {
if (head == null)
throw new RuntimeException("invalid List,can't be null");
if (head.next == null)
return head;
ListNode reversedHead = null;
ListNode node = head;
ListNode preNode = null;
while (node != null) {
ListNode nextNode = node.next;
if (nextNode == null)
reversedHead = node;
// 赋值顺序不能变
node.next = preNode;
preNode = node;
node = nextNode;
}
return reversedHead;
}
public static void print(ListNode head) {
if (head == null)
System.out.println("当前链表为空");
while (head != null) {
System.out.print(head.data + ",");
head = head.next;
}
}
public static void main(String[] args) {
ListNode node1 = new ListNode(4, null);
ListNode node2 = new ListNode(3, node1);
ListNode node3 = new ListNode(2, node2);
ListNode node4 = new ListNode(1, node3);
print(reverseList(node4));
System.out.println();
print(reverseList(new ListNode(5, null)));
System.out.println();
print(reverseList(new ListNode()));
System.out.println();
}
}
剑指offer面试题16:反转链表的更多相关文章
- 剑指Offer:面试题16——反转链表(java实现)
问题描述 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后的链表的头结点.链表结点如下: public class ListNode { int val; ListNode next = n ...
- 剑指Offer - 九度1518 - 反转链表
剑指Offer - 九度1518 - 反转链表2013-11-30 03:09 题目描述: 输入一个链表,反转链表后,输出链表的所有元素.(hint : 请务必使用链表) 输入: 输入可能包含多个测试 ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- 剑指offer 面试题35.复杂链表的复制
时间O(N),空间O(N) /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomList ...
- C++版 - 剑指offer 面试题16:反转链表(Leetcode 206: Reverse Linked List) 题解
面试题16:反转链表 提交网址: http://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId= ...
- 【剑指offer 面试题16】反转链表
思路: 用三个指针preNode.curNode.nextNode完成. #include <iostream> using namespace std; struct ListNode ...
- 剑指Offer面试题16(Java版):反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 解决与链表相关的问题总是有大量的指针操作.而指针操作的代码总是easy出错的. 非常多的面试官喜欢出链表相关的问题,就是 ...
- 剑指offer(15)反转链表
题目描述 输入一个链表,反转链表后,输出链表的所有元素. 题目分析 至少需要三个指针pPre(指向前一个结点).pCurrent(指向当前的结点,在代码中就是pHead).pPnext(指向后一个结点 ...
- 剑指offer十五之反转链表
一.题目 输入一个链表,反转链表后,输出链表的所有元素. 二.思路 详细分析见代码注释 三.代码 public class Solution { public ListNode Reverse ...
- 剑指offer——面试题16:数值的整数次方
// 面试题16:数值的整数次方 // 题目:实现函数double Power(double base, int exponent),求base的exponent // 次方.不得使用库函数,同时不需 ...
随机推荐
- 关于HTML5中的sessionStorage的会话级缓存使用
sessionStorage作为HTML5的Web Storage的两种存储方式之一. 用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数 ...
- mac环境下mongodb的安装和使用
mac环境下mongodb的安装和使用 简介 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB 是一个介于关系数据 ...
- vim 中文乱码怎么解决
一般来说只需要正确设置vim的编码识别序列就很少会遇到乱码问题: set fileencodings=ucs-bom,utf-8,utf-16,gbk,big5,gb18030,latin1 这个设置 ...
- Eclipse 新建 Maven web 项目
File --> New --> Maven Project --> 选择存放路径 --> 选择骨架 --> 输入Maven坐标 --> 初步成型,下面还要配置 1 ...
- spring.boot 无法加载oracle驱动的可能原因
.找到本地oracle安装目录下的ojdbc6.jar包,为了方便起见,复制到某盘的根目录(如F盘根目录),在cmd下进入F盘根目录(也就是ojdbc.jar复制的目录),同时我们需要查看ojdbc的 ...
- BaseDao.util(虎大将军)
package logistics.util; import java.sql.Connection; import java.sql.PreparedStatement; import java.s ...
- H5canvas画类似心电图
HTML5 的 canvas 元素使用 JavaScript 在网页上绘制图像,我们可以使用canvas来绘制类似心电图的东西. 效果图如下: <!DOCTYPE html> <ht ...
- Sorl 4.10 入门合集
Sorl4.10 + Tomcat 7.0 win7环境下的安装 1.首先是到apache官网下载sorl 4.10 ,解压 2.进入路径\solr-4.10.4\example\webapps,拷 ...
- IDEA导入Maven多项目(Mac下)
主界面Import Project 选择maven项目目录文件夹 选择Import project from external model 中的maven选项,Next下一步 Sources和Docu ...
- SVN用法及常见问题分析
SVN中英文对比: 1,今天遇到的新问题,在父节点里面找不到子节点文件夹,在子节点里面可以上传但是却一直上传不上去. 具体原因:子文件夹里面有个.svn文件(打开隐藏的项目可见),是的子文件夹的svn ...