反转链表算法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;

第三部分:尾部处理:
反转最后一个节点,并返回
 1  public Node inverse(Node q) {//q初始化为头结点:一开始是: p=null,q=head r = head.next
 2         //参考:https://blog.csdn.net/feliciafay/article/details/6841115
 3          if (q == null) return null;//头结点为null,退出
 4         /**
 5          * 初始化部分:p=null,q=head(由函数参数传入) r = q.next
 6          */
 7 //        一开始是: p=null,q=head r = head.next
 8         Node r = q.next; //r是记录还有多少个节点,即p q r,如果r=null,表示后面已经没有更多的节点了,初始化为第二个
 9         Node p = null; //初始化为null
10         /**
11          * 循环部分: q反转 + pqr整体移动。
12          */
13         while (r != null) { //当当前节点有后继节点时
14             //反转节点q.  (注意:q 是中心节点)
15             q.next = p;//q的后继节点指向他的父节点p
16             //p,q,r相继往后移动
17             p = q;     //p后移动一个节点,即指向后继q
18             q = r; //q也往后移动一个节点,指向后继r
19             r = r.next;//r移动到下一个节点
20         }
21         /**
22          * 尾部处理部分:q反转
23          */
24         q.next = p;//由于r到了最后节点的空子节点后,p,q还未反转,故将其反转
25         return q;//返回新的头结点,即原来的尾节点
26     }
1 //节点类
2 static class Node {//
3         Node next;
4         int data;
5
6         Node(int data) {
7             this.data = data;
8         }
9     }

2018-12-11  13:24:26  DuXia Library XT

原文地址:https://www.cnblogs.com/XT-xutao/p/10101623.html

时间: 2024-11-05 20:34:06

反转链表算法Java实现的相关文章

反转链表算法题

反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶:你可以迭代或递归地反转链表.你能否用两种方法解决这道题? 解决方案 方法一:迭代 假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3. 在遍历列表时,将当前节点的 next 指针改为指向前一个元素.由于节点没有引用其上一个节点,因此必须事先存储其前一个元素.在更改引用之前,还需要另一个

剑指Offer-题16 反转链表(Java)

问题描述:定义一个函数,输入一个链表的头结点,反转该链表并输出翻转后链表的头结点: 问题分析:为避免反转时,当前节点的next指针指向前驱lastNode,而无法继续索引其后继nextNode,故在遍历过程中,注意要同时记录其前驱与后继: 同时注意鲁棒性:如输入链表头指针为null或者只有一个节点的情况: 代码: /*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val;

链表面试题(一):反转链表的算法实现

关于链表的考察 链表是面试里面经常涉及到的考点,因为链表的结构相比于Hashmap.Hashtable.Concurrenthashmap或者图等数据结构简单许多,对于后者更多面试的侧重点在于其底层实现.比如Hashmap中Entry<k,v>等操作.如何扩容.容量的设定等.链表的考察更侧重于代码的书写和思路的形成.虽然说,链表的结构简单,但是涉及到指针的操作,容易引申出一些挑战性的考题,其中也牵涉到诸多小的细节的考虑,更能看出代码书写的能力和功底. 面试题:反转链表 题目:定义一个函数,输入

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

算法概述:要求实现将一条单向链表反转并考虑时间复杂度. 算法分析: 数组法(略): 将列表元素逐个保存进数组,之后再逆向重建列表 点评:实现逻辑最简单,需要额外的内存开销. 移动指针: 通过三个指针逐个从链表头开始逐一反转链表元素的指针 点评:不需要额外的内存开销,会改变原始链表. 递归: 以递归的方式首先找到链表尾部,再逐一反转指针 点评:不需要额外的内存开销,不会改变原始链表. 算法实现: 构建链表结构 /* 节点结构 */ struct NODE { int data; struct NO

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

出题:反转链表(递归和非递归解法): 分析:有递归跟非递归实现,注意对原始链表头节点的处理,因为其他节点都指向下一个节点,其需要指向NULL: 解题: 1 struct Node { 2 int v; 3 Node *next; 4 }; 5 Node* NonRecursiveListReverse(Node *head) { 6 if(head == NULL) return NULL; 7 Node *previous=NULL, *current=head, *temp=NULL; 8

写个链表反转的算法

没出去面试被打击之前,你永远不知道自己有多low逼,其实也不是技术不如别人,就是面试的技巧吧,去大公司面试,一般聊两句之后觉得还可以的就会问你算法.关于算法,其实平时的工作中不太用得着,但是却能考验一个人的能力,下面就先写一个链表反转的算法吧 public ListNode reverseList(ListNode head) { ListNode first = null; ListNode current = head; ListNode next = null; while(current

剑指Offer面试题16(Java版):反转链表

题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点. 解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的.很多的面试官喜欢出链表相关的问题,就是想通过指针操作来考察应聘者的编码功底.为了避免出错,我们最好先进行全面的分析.在实际软件开发周期中,设计的时间通常不会比编码的时间短.在面试的时候我们不要急于动手写代码,而是一开始仔细分析和涉及,这将会给面试官留下好的印象.与其给出一段漏洞百出的代码,倒不如仔细分析再写出鲁棒性好的代码. 为了正确的反转一个

算法:反转链表。

题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路 定义当前head,前序节点pre,后续节点next:依次遍历所有节点,将所有节点的next指向前一个节点. package LG.nowcoder; /** * @Author liguo * @Description 输入一个链表,反转链表后,输出新链表的表头. * 思路:定义当前head,前序节点pre,后续节点next: * 依次遍历所有节点,将所有节点的next指向前一个节点 * @Data 2018-08-13 23:24

剑指Offer编程题(Java实现)——反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头. 思路一 使用头插法迭代进行反转 实现 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode ReverseList(ListNode head) { ListNode newHead = new ListNode(-1