`
somefuture
  • 浏览: 1089716 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java单向链表反转

阅读更多

Java API中的链表是双向的,我们这里自己新建一个类代表我们的链表元素结点:

class Node {
		int value;
		Node next;

		public Node(int i) {
			setValue(i);
		}

		public Node() {
		}

		public int getValue() {
			return value;
		}

		public void setValue(int value) {
			this.value = value;
		}

		public Node getNext() {
			return next;
		}

		public void setNext(Node next) {
			this.next = next;
		}
	}

 然后我们拼接一根链表:

Node linkedList = new Node();
		linkedList.setValue(1);
		Node current = linkedList;
		for (int i = 2; i < 10; i++) {
			Node tNode = new Node(i);
			current.setNext(tNode);
			current = tNode;
		}

 这跟链表有9个元素,从1一直指向9.

第一种方法需要两个额外的结点空间,通过循环不停的反向相邻结点并记录后续的位置:

	private Node reverse(Node head) {
		Node temp = head.getNext();
		Node flag = temp.getNext();
		head.setNext(null);
		while (flag != null) {
			temp.setNext(head);
			head = temp;
			temp = flag;
			flag = flag.getNext();
		}
		temp.next = head;
		return temp;
	}

 把链表头结点传入即可实现反转并返回新的头结点。

我努力尝试了使用一个额外结点实现反转,没能成功:

	private Node reverse(Node head) {
		Node temp = head.getNext();
		while (temp.getNext() != null) {
			head.getNext().setNext(head);
			head = temp;
			temp = temp.next;
		}
		temp.next = head;
		return temp;
	}

 如果各位有只使用一个额外空间就能反转的请留言指点,谢谢。

 

 

第二种反转方法是使用迭代,需要传入链表的前两个元素:

	private Node reverseRecur(Node head, Node next) {
		if (next == null) {
			return head;
		}
		if (head.getNext().equals(next)) {//第一次进来
			head.setNext(null);
		}
		if (next.getNext() != null) {
			Node next2 = next.getNext();
			next.setNext(head);
			return reverseRecur2(next, next2);
		}
		next.setNext(head);
		return next;
	}

 我努力尝试只传入头结点来反转,但是总是不成功:

	private Node reverseRecur(Node head) {
		Node tail = head.getNext();
		if (tail.getNext() != null) {
			Node flag = reverseRecur(tail);
			flag.setNext(head);
			head.setNext(null);
			return head;
		}
		tail.setNext(head);
		head.setNext(null);
		return head;
	}

 

 

我将链表长度设置为10000进行对比,循环的时间和空间都比迭代更好。

为什么迭代更常用呢?

0
0
分享到:
评论

相关推荐

    Java实现单向链表反转

    Java实现单向链表反转 Java实现单向链表反转是指将单向链表的顺序颠倒,例如原链表为A-&gt;B-&gt;C-&gt;D-&gt;E-&gt;F,反转后变为F-&gt;E-&gt;D-&gt;C-&gt;B-&gt;A。这种操作在实际开发中非常有用,例如在数据处理、数据分析等领域。 单向链表...

    java链表反转及排序

    在“java链表反转及排序”这个主题中,我们将探讨如何在Java中实现单向链表的反转和排序。首先,我们创建一个链表节点类,包含数据和指向下一个节点的引用: ```java public class ListNode { int val; // 节点值 ...

    JAVA双向链表反转实现

    以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...

    单向链表源代码

    在Java编程中,单向链表通常通过定义一个节点类来实现,每个节点包含数据和指向下一个节点的引用。下面我们将深入探讨单向链表的原理、结构以及如何用Java编写源代码。 单向链表的基本结构: 单向链表由一系列节点...

    Java算法(链表操作实例)

    4. **反转链表**:这是一个常见的链表算法问题,可以递归或迭代地解决。以下是一个迭代的解决方案: ```java public ListNode reverseList(ListNode head) { ListNode prev = null, current = head, nextTemp = ...

    非循环单向链表JAVA实现

    非循环单向链表是一种常见的数据结构,在Java中实现它能帮助我们理解链表的基本操作,如插入、删除和遍历。在这个主题中,我们将深入探讨如何在Java中创建一个非循环单向链表,以及如何通过源码来实现其核心功能。 ...

    如何使用递归和非递归方式反转单向链表

    在链表反转问题中,我们从链表头部开始,如果当前节点为空或其下一个节点为空,则返回当前节点(这是递归的终止条件)。否则,我们将递归地反转从当前节点的下一个节点开始的子链表,得到 `reverseRest`。然后,我们...

    山东大学大一高程JAVA链表例题.zip

    链表的主要类型有单向链表、双向链表和循环链表。 1. 单向链表:每个节点只有一个指向前一个节点的指针,最后一个节点的指针为null。操作包括插入、删除、遍历等。 2. 双向链表:每个节点有两个指针,分别指向前一...

    leetcode-链表笔记

    - **递归法**:对于某些特定问题,如链表反转,递归可以简化代码逻辑。 - **快慢指针**:在查找环和确定链表中间节点时,使用快慢指针可以有效解决问题。 - **双指针**:在合并链表或查找特定节点时,两个指针...

    能直接用的链表

    3. 查找元素:遍历链表以查找特定值的节点,可能包括线性搜索和二分搜索等方法,取决于链表的类型(单向链表、双向链表或循环链表)。 4. 遍历链表:从头节点开始逐个访问所有节点,打印或处理其数据。 5. 更新元素...

    数据结构与算法-顺序表(链表篇)

    在单向链表中,每个节点只有一个指针,指向其后的节点;而在双向链表中,每个节点有两个指针,分别指向前一个和后一个节点。双向链表提供了更多的灵活性,但它的实现也更复杂。 在"List_2"这个文件中,很可能是包含...

    链表(实验报告,指导书,源程序)

    链表有多种类型,其中最常见的是单向链表和双向链表。单向链表中的每个节点只有一个指针,通常指向下一个节点;双向链表则更复杂,每个节点有两个指针,分别指向前一个节点和后一个节点。双向链表的优势在于可以更...

    reverse link

    在IT行业中,链表是一种非常基础且重要的数据结构,它由一系列节点组成,每个节点包含数据...文件"ReverseLinkedList"很可能是包含了实现这个功能的Java代码,进一步的分析和学习可以帮助深入理解双向链表反转的细节。

    【手绘漫画】图解LeetCode之反转链表(LeetCode206题)

    通过理解链表的基本概念、掌握单向链表反转的核心原理,并结合具体的代码实现和复杂度分析,读者可以更加深刻地理解链表这一重要的数据结构及其应用。同时,文中提供的相关练习题目可以帮助进一步巩固所学知识。

    链表

    首先,我们来看看链表的两种主要类型:单向链表和双向链表。 1. 单向链表:每个节点只有一个指向下一个节点的指针。这种链表只能按照一个方向(通常是向前)遍历,插入和删除操作相对简单,但无法向后移动。 2. ...

    1_12313212313链表.7z

    单向链表中的每个节点包含数据部分和指向下一个节点的指针,而双向链表则增加了一个指针,用于指向前一个节点,这样可以方便地向前或向后遍历。 在“1_链表”这个压缩包文件中,可能包含了关于链表的各种实现和操作...

    实验一链表及其应用.zip

    链表分为单向链表和双向链表,单向链表只能从前往后遍历,而双向链表可以向前或向后遍历。 实验内容可能包括以下部分: 1. **链表的创建**:首先,我们需要创建一个链表结构,这通常涉及到定义节点类,包括数据和...

    简单的双向循环链表

    双向循环链表与单向链表不同,它在每个节点中不仅保存了指向下一个节点的指针,还保存了指向前一个节点的指针,这种设计使得在链表中的前后移动更为便捷。在循环链表中,最后一个节点会指向第一个节点,形成一个闭合...

Global site tag (gtag.js) - Google Analytics