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进行对比,循环的时间和空间都比迭代更好。
为什么迭代更常用呢?
相关推荐
Java实现单向链表反转 Java实现单向链表反转是指将单向链表的顺序颠倒,例如原链表为A->B->C->D->E->F,反转后变为F->E->D->C->B->A。这种操作在实际开发中非常有用,例如在数据处理、数据分析等领域。 单向链表...
在“java链表反转及排序”这个主题中,我们将探讨如何在Java中实现单向链表的反转和排序。首先,我们创建一个链表节点类,包含数据和指向下一个节点的引用: ```java public class ListNode { int val; // 节点值 ...
以下是使用迭代方式实现双向链表反转的Java代码: ```java public void reverse() { if (head == null || head.next == null) { return; } Node current = head; Node previous = null; while (current != ...
在Java编程中,单向链表通常通过定义一个节点类来实现,每个节点包含数据和指向下一个节点的引用。下面我们将深入探讨单向链表的原理、结构以及如何用Java编写源代码。 单向链表的基本结构: 单向链表由一系列节点...
4. **反转链表**:这是一个常见的链表算法问题,可以递归或迭代地解决。以下是一个迭代的解决方案: ```java public ListNode reverseList(ListNode head) { ListNode prev = null, current = head, nextTemp = ...
非循环单向链表是一种常见的数据结构,在Java中实现它能帮助我们理解链表的基本操作,如插入、删除和遍历。在这个主题中,我们将深入探讨如何在Java中创建一个非循环单向链表,以及如何通过源码来实现其核心功能。 ...
在链表反转问题中,我们从链表头部开始,如果当前节点为空或其下一个节点为空,则返回当前节点(这是递归的终止条件)。否则,我们将递归地反转从当前节点的下一个节点开始的子链表,得到 `reverseRest`。然后,我们...
链表的主要类型有单向链表、双向链表和循环链表。 1. 单向链表:每个节点只有一个指向前一个节点的指针,最后一个节点的指针为null。操作包括插入、删除、遍历等。 2. 双向链表:每个节点有两个指针,分别指向前一...
- **递归法**:对于某些特定问题,如链表反转,递归可以简化代码逻辑。 - **快慢指针**:在查找环和确定链表中间节点时,使用快慢指针可以有效解决问题。 - **双指针**:在合并链表或查找特定节点时,两个指针...
3. 查找元素:遍历链表以查找特定值的节点,可能包括线性搜索和二分搜索等方法,取决于链表的类型(单向链表、双向链表或循环链表)。 4. 遍历链表:从头节点开始逐个访问所有节点,打印或处理其数据。 5. 更新元素...
在单向链表中,每个节点只有一个指针,指向其后的节点;而在双向链表中,每个节点有两个指针,分别指向前一个和后一个节点。双向链表提供了更多的灵活性,但它的实现也更复杂。 在"List_2"这个文件中,很可能是包含...
链表有多种类型,其中最常见的是单向链表和双向链表。单向链表中的每个节点只有一个指针,通常指向下一个节点;双向链表则更复杂,每个节点有两个指针,分别指向前一个节点和后一个节点。双向链表的优势在于可以更...
在IT行业中,链表是一种非常基础且重要的数据结构,它由一系列节点组成,每个节点包含数据...文件"ReverseLinkedList"很可能是包含了实现这个功能的Java代码,进一步的分析和学习可以帮助深入理解双向链表反转的细节。
通过理解链表的基本概念、掌握单向链表反转的核心原理,并结合具体的代码实现和复杂度分析,读者可以更加深刻地理解链表这一重要的数据结构及其应用。同时,文中提供的相关练习题目可以帮助进一步巩固所学知识。
首先,我们来看看链表的两种主要类型:单向链表和双向链表。 1. 单向链表:每个节点只有一个指向下一个节点的指针。这种链表只能按照一个方向(通常是向前)遍历,插入和删除操作相对简单,但无法向后移动。 2. ...
单向链表中的每个节点包含数据部分和指向下一个节点的指针,而双向链表则增加了一个指针,用于指向前一个节点,这样可以方便地向前或向后遍历。 在“1_链表”这个压缩包文件中,可能包含了关于链表的各种实现和操作...
链表分为单向链表和双向链表,单向链表只能从前往后遍历,而双向链表可以向前或向后遍历。 实验内容可能包括以下部分: 1. **链表的创建**:首先,我们需要创建一个链表结构,这通常涉及到定义节点类,包括数据和...
双向循环链表与单向链表不同,它在每个节点中不仅保存了指向下一个节点的指针,还保存了指向前一个节点的指针,这种设计使得在链表中的前后移动更为便捷。在循环链表中,最后一个节点会指向第一个节点,形成一个闭合...