/**
* @author luochengcheng
* 定义一个单链表
*/
class Node {
//变量
private int record;
//指向下一个对象
private Node nextNode;
public Node(int record) {
super();
this.record = record;
}
public int getRecord() {
return record;
}
public void setRecord(int record) {
this.record = record;
}
public Node getNextNode() {
return nextNode;
}
public void setNextNode(Node nextNode) {
this.nextNode = nextNode;
}
}
/**
* @author luochengcheng
* 两种方式实现单链表的反转(递归、普通)
* 新手强烈建议旁边拿着纸和笔跟着代码画图(便于理解)
*/
public class ReverseSingleList {
/**
* 递归,在反转当前节点之前先反转后续节点
*/
public static Node reverse(Node head) {
if (null == head || null == head.getNextNode()) {
return head;
}
Node reversedHead = reverse(head.getNextNode());
head.getNextNode().setNextNode(head);
head.setNextNode(null);
return reversedHead;
}
/**
* 遍历,将当前节点的下一个节点缓存后更改当前节点指针
*
*/
public static Node reverse2(Node head) {
if (null == head) {
return head;
}
Node pre = head;
Node cur = head.getNextNode();
Node next;
while (null != cur) {
next = cur.getNextNode();
cur.setNextNode(pre);
pre = cur;
cur = next;
}
//将原链表的头节点的下一个节点置为null,再将反转后的头节点赋给head
head.setNextNode(null);
head = pre;
return head;
}
public static void main(String[] args) {
Node head = new Node(0);
Node tmp = null;
Node cur = null;
// 构造一个长度为10的链表,保存头节点对象head
for (int i = 1; i < 10; i++) {
tmp = new Node(i);
if (1 == i) {
head.setNextNode(tmp);
} else {
cur.setNextNode(tmp);
}
cur = tmp;
}
//打印反转前的链表
Node h = head;
while (null != h) {
System.out.print(h.getRecord() + " ");
h = h.getNextNode();
}
//调用反转方法
head = reverse2(head);
System.out.println("\n**************************");
//打印反转后的结果
while (null != head) {
System.out.print(head.getRecord() + " ");
head = head.getNextNode();
}
}
}
代码来自:
http://poly.iteye.com/blog/1748272
运行:
C:\ex>java ReverseSingleList
0 1 2 3 4 5 6 7 8 9
**************************
9 8 7 6 5 4 3 2 1 0
源码:
分享到:
相关推荐
单链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C++中,我们通常通过定义一个结构体或类来表示链表节点。在这个例子中,我们有一个名为`linkb`的结构体,它有两个成员...
本文将深入探讨如何使用Python3实现这个操作,包括迭代和递归两种方法。 ### 方案一:迭代 迭代方法是通过遍历链表,逐个改变节点的next指针来达到反转的效果。以下是一个简单的实现: ```python class ListNode:...
单链表反转的3种方法实现示例代码 单链表是一种常见的数据结构,它在计算机科学和软件工程中广泛应用。单链表的反转是面试中经常会遇到的问题,本文将为大家介绍单链表实现反转的3种方法,并通过示例代码进行详细的...
在Java实现中,通常有两种方法:迭代和递归。迭代方法使用三个指针来控制遍历过程,而递归方法通过函数的递归调用实现。 迭代方法的操作核心在于循环遍历,逐个将节点的next指针指向前一个节点,并同时移动三个指针...
代码主要包括两个部分:单链表的遍历和反转。单链表的遍历是使用while循环,从头节点开始,依次访问每个节点,直到尾节点。在遍历过程中,使用`System.out.print`语句将每个节点的数据输出。单链表的反转是使用头插...
单链表的就地逆置是指在不申请额外空间的情况下,改变链表中节点的指针方向,使得链表的顺序反转。具体来说,就是使原来指向后继节点的指针改为指向前驱节点,从而达到整个链表逆序的效果。 #### 逆置算法步骤 ...
"C语言实现单链表反转" C语言实现单链表反转是指在C语言中实现单链表的反转操作,即将链表的结点顺序颠倒过来。这个操作需要对指针有深入的理解,否则很容易出现指针丢失和内存泄漏的问题。 一、理解指针 要想写...
反转链表的方法通常有两种:迭代和递归。迭代法通过三个指针pre、curr和next配合,pre始终指向curr的前一个节点,curr遍历链表,每次更新curr.next为curr的前一个节点,最后将头节点指向pre即可。递归法则利用递归...
无论是循环还是递归,这两种方法都能有效地反转单链表。循环方法的时间复杂度为O(n),空间复杂度为O(1),因为它只需要常量级别的额外空间。递归方法虽然直观,但时间复杂度同样是O(n),但由于递归调用,空间复杂度为...
单链表是一种常见的线性数据结构,其中每个元素包含一个指向下一个元素的指针。就地反转指的是在不使用额外的数据结构的情况下,改变链表中各节点之间的连接关系,使链表的顺序完全颠倒。 #### 代码解析 ##### ...
寻找中间元素有两种常见方法:一是使用双指针,一个指针每次移动一步,另一个指针每次移动两步,当慢指针到达链表尾部时,快指针正好位于中间;二是利用长度,先计算链表长度n,然后从头节点开始,每步移动到第n/2...
单链表是一种基础的数据结构,它在计算机科学中扮演着重要的角色,特别是在处理动态数据集合时。单链表由一系列节点组成,每个节点包含两部分:数据域和指针域。数据域存储实际的元素值,而指针域则指向链表中的下一...
在C语言中使用类来实现单链表的操作是一种非常实用的方法,尤其当需要对链表进行复杂的管理时。本篇将基于提供的`node.h`头文件和`node.cpp`源代码,详细阐述如何通过类的方式在C语言中实现单链表的基本操作,包括...
单链表是一种基础的数据结构,它由一系列节点组成,每个节点包含数据和指向下...这个过程不涉及额外的存储空间,是一种就地反转的方法。在Python中,通过定义合适的指针并逐步调整它们的指向,可以有效地实现这一操作。
这可以通过迭代或递归两种方式来实现。 1. **迭代法**:在迭代法中,我们通常使用三个指针,`prev`、`current`和`next`。初始时,`prev`为null,`current`为链表头。然后,我们循环遍历链表,每次迭代中,`next`...
单链表是数据结构中的一种基本结构,它是一种顺序存储的链式结构。单链表的合并是指将两个或多个单链表合并成一个单链表,而保持原来的顺序。单链表的逆序是指将单链表的 顺序反转。 单链表的合并(非递归) ...
通过以上分析,我们可以看出,使用非递归方法逆序单链表不仅能够有效避免递归可能导致的栈溢出问题,而且在性能上往往优于递归方法。本示例中的`reverse`函数清晰地展示了如何利用两个辅助指针来遍历并逆序单链表,...
单链表是一种基础的数据结构,它在计算机科学中扮演着重要的角色,特别是在数据存储和算法设计方面。单链表由一系列节点组成,每个节点包含数据元素以及指向下一个节点的引用,最后一个节点的引用通常为null,标志着...
以上就是单链表常见的几种面试算法及其实现方法。这些算法不仅在面试中经常被提及,在实际工作中也十分有用。掌握它们不仅能提高你的编程能力,还能加深你对数据结构的理解。希望本文对你有所帮助!