反转链表算法Java实现
之前遇到反转链表的算法,比较晦涩难解,但其实挺简单的。
目标:将一个顺序链表反转。
思路:用三个辅助节点,每次实现一个节点的指向反转,即他的后继变为他的前驱。
三个辅助节点: p q r 按顺序分别指向 节点0,1,2, 然后一次次移动,指向1,2,3 ; 2,3,4......
算法分为三部分:
第一部分:初始化部分:
q是中心节点,是每次反转的节点,于是q是由函数参数传入的,前面的节点p一个是null,后面的节点r是q的后继节点q.next
第二部分:循环部分
分为两个操作:
1.反转:q的后继变为他的前驱: q.next = p
2.移动:pqr向后移动一位:
p = q; q = r;
r = r.next;
第三部分:尾部处理:
反转最后一个节点,并返回
public Node inverse(Node q) {//q初始化为头结点:一开始是: p=null,q=head r = head.next
//参考:https://blog.csdn.net/feliciafay/article/details/6841115
if (q == null) return null;//头结点为null,退出
/**
* 初始化部分:p=null,q=head(由函数参数传入) r = q.next
*/
// 一开始是: p=null,q=head r = head.next
Node r = q.next; //r是记录还有多少个节点,即p q r,如果r=null,表示后面已经没有更多的节点了,初始化为第二个
Node p = null; //初始化为null
/**
* 循环部分: q反转 + pqr整体移动。
*/
while (r != null) { //当当前节点有后继节点时
//反转节点q. (注意:q 是中心节点)
q.next = p;//q的后继节点指向他的父节点p
//p,q,r相继往后移动
p = q; //p后移动一个节点,即指向后继q
q = r; //q也往后移动一个节点,指向后继r
r = r.next;//r移动到下一个节点
}
/**
* 尾部处理部分:q反转
*/
q.next = p;//由于r到了最后节点的空子节点后,p,q还未反转,故将其反转
return q;//返回新的头结点,即原来的尾节点
}
//节点类
static class Node {//
Node next;
int data; Node(int data) {
this.data = data;
}
}
2018-12-11 13:24:26 DuXia Library XT
反转链表算法Java实现的更多相关文章
- 剑指Offer-15.反转链表(C++/Java)
题目: 输入一个链表,反转链表后,输出新链表的表头. 分析: 可以利用栈将链表元素依次压入栈中,再从栈中弹出元素重新建立链表,返回头节点. 也可以在原有的链表上来翻转,先保存当前节点的下一个节点,然后 ...
- 面试之路(28)-反转链表(reverse ListNode)
反转链表: java类 public class ListNode{ int key; ListNode next; } 思路分析: 需要三个指针,current,prev和next. current ...
- 算法是什么(二)手写个链表(java)
算法是什么(二)手写个链表(java) liuyuhang原创,未经允许禁止转载 目录 算法是什么(〇) 很多语言的API中都提供了链表实现,或者扩展库中实现了链表. 但是更多的情况下,Map(或 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案
206.反转链表 1.题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-> ...
- Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现
Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...
- 数据结构与算法(c++)——反转链表
算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐 ...
- 【Java】 剑指offer(24) 反转链表
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头 ...
- 笔试算法题(13):反转链表 & 左旋转字符串
出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: struct Node { int v; Nod ...
- LeetCode初级算法--链表01:反转链表
LeetCode初级算法--链表01:反转链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...
随机推荐
- Entity Framework 6.0 常见异常及解决办法
Ø 简介 本文主要记录 EF(Entity Framework) 在平时的开发中可能遇到的异常,以及应该如何去解决. 1. System.InvalidOperationException 1) ...
- 清除 SQL Server Management Studio 服务器名称历史记录
Ø 前言 在开发过程中,经常使用 SQL Server Management Studio 连接本地或远程 SQL Server 服务器,时间长了可能有些名称就不用了或者重复了,SQL Server ...
- [译]MediatR, FluentValidation, and Ninject using Decorators
原文 CQRS 我是CQRS模式的粉丝.对我来说CQRS能让我有更优雅的实现.它同样也有一些缺点:通常需要更多的类,workflow不总是清晰的. MediatR MediatR的文档非常不错,在这就 ...
- 关于PHP中的全局变量global和$GLOBALS的不同区分
1.global Global的作用是定义全局变量,但是这个全局变量不是应用于整个网站,而是应用于当前页面,包括include或require的所有文件. 但是在函数体内定义的global变量,函数体 ...
- [kuangbin带你飞]专题一 简单搜索(回顾)
A - 棋盘问题 POJ - 1321 注意条件:不能每放一个棋子,就标记一行和一列,我们直接枚举每一行就可以了. AC代码: #include<iostream> #include< ...
- jQuery $.ajax传递数组的traditional参数传递必须true
起初我认为traditional:true,可有可无,但是后来不用traditional的时候,发现后台无法获取selectUsers的值,那么可以肯定的是traditional默认值是false.当 ...
- Linux 逻辑卷管理LVM
LVM概述 Logical Volume Manager,逻辑卷管理 屏蔽了底层磁盘布局,便于动态调整磁盘容量 需要注意:/boot分区用于存放引导文件,不能应用LVM机制 LVM结构 目标:将sdb ...
- 20165231 2017-2018-2 《Java程序设计》第2周学习总结
前言 第二周算是正正式式的学习了java程序设计.之前对java是一片茫然,现在算是初见端倪了,知道了java程序的基本开头,多个class时该运行哪个,哪个是输出打印语句等等. 目前我使用的java ...
- SNet解读
解读论文:Learning Local Image Descriptors with Deep Siamese and Triplet Convolutional Networks by Minimi ...
- python的MySQLdb库链接MySQL入门代码
链接:http://www.runoob.com/python/python-mysql.html