之前遇到反转链表的算法,比较晦涩难解,但其实挺简单的。

目标:将一个顺序链表反转。

思路:用三个辅助节点,每次实现一个节点的指向反转,即他的后继变为他的前驱。

三个辅助节点: 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实现的更多相关文章

  1. 剑指Offer-15.反转链表(C++/Java)

    题目: 输入一个链表,反转链表后,输出新链表的表头. 分析: 可以利用栈将链表元素依次压入栈中,再从栈中弹出元素重新建立链表,返回头节点. 也可以在原有的链表上来翻转,先保存当前节点的下一个节点,然后 ...

  2. 面试之路(28)-反转链表(reverse ListNode)

    反转链表: java类 public class ListNode{ int key; ListNode next; } 思路分析: 需要三个指针,current,prev和next. current ...

  3. 算法是什么(二)手写个链表(java)

    算法是什么(二)手写个链表(java)   liuyuhang原创,未经允许禁止转载 目录 算法是什么(〇) 很多语言的API中都提供了链表实现,或者扩展库中实现了链表. 但是更多的情况下,Map(或 ...

  4. 2021字节跳动校招秋招算法面试真题解题报告--leetcode206 反转链表,内含7种语言答案

    206.反转链表 1.题目描述 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1-> ...

  5. Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

    Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...

  6. 数据结构与算法(c++)——反转链表

    算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐 ...

  7. 【Java】 剑指offer(24) 反转链表

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头 ...

  8. 笔试算法题(13):反转链表 & 左旋转字符串

    出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: struct Node { int v; Nod ...

  9. LeetCode初级算法--链表01:反转链表

    LeetCode初级算法--链表01:反转链表 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

随机推荐

  1. Nginx负载均衡session会话保持方法

    负载均衡时,为了保证同一用户session会被分配到同一台服务器上,可以使用以下方法: 1.使用cookie 将用户的session存入cookie里,当用户分配到不同的服务器时,先判断服务器是否存在 ...

  2. 一次针对多台服务器交互式主机命令采集Python脚本编写

    [环境介绍]   系统环境:Linux + Python 2.7.10(监控主机)   [背景描述] 需求:每次节假日或者重要时间时,需要对数据库主机信息进行检查,比如主机空间使用率之类.有时候需要执 ...

  3. 使用Nginx在windows和linux上搭建集群

    Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器 特点:反向代理 负载均衡 动静分离… 反向代理(Reverse Pro ...

  4. luogu 2371 墨墨的等式

    1.背包dp #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<=y;i++) #define ll ...

  5. excel数据 入库mysql 和 mysql数据 导入excel文件

    1.excel数据入库mysql 首先准备excel文件, 标红的地方需要留意,一个是字段名所在行,一个表名对应页: 然后私用mysql工具 navicat, 选择数据库,然后导入文件, 选中相应ex ...

  6. sql -leetcode 178. Rank Scores

    Score 很好得到: select Score from Scores order by Score desc; 要得到rank, 可以通过比较比当前Score 大的Score 的个数得到: sel ...

  7. 一颗树下的input框超出的部分打点鼠标移动显示

  8. Codeforces Round #536 (Div. 2)

    前言 如您所见这又是一篇咕了的文章,直接咕了10天 好久没打CF了 所以还是个蓝名菜鸡 机房所有人都紫名及以上了,wtcl 这次前4题这么水虽然不知道为什么花了1h,结果不知道为什么搞到一半出锅了,后 ...

  9. HashSet去除List重复元素

    使用Hashset 去重复 例一,List<String> 去重复 public class main { public static void main(String[] args) { ...

  10. DeepLearning.ai-Week2-Keras tutorial-the Happy House

    1 - Import Packages import numpy as np from keras import layers from keras.layers import Input, Dens ...