Java单向链表反转

简介: Java API中的链表是双向的,我们这里自己新建一个类代表我们的链表元素结点: class Node { int value; Node next; public Node(int i) { setValue(i); } public N...

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进行对比,循环的时间和空间都比迭代更好。

为什么迭代更常用呢?

目录
相关文章
|
2月前
|
Java
java数据结构,双向链表的实现
文章介绍了双向链表的实现,包括数据结构定义、插入和删除操作的代码实现,以及双向链表的其他操作方法,并提供了完整的Java代码实现。
java数据结构,双向链表的实现
|
1月前
|
存储 安全 Java
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
【用Java学习数据结构系列】探索顺序表和链表的无尽秘密(附带练习唔)pro
25 3
|
5月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
1月前
|
存储
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(一)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
1月前
|
算法 Java
数据结构与算法学习六:单向环形链表应用实例的约瑟夫环问题
这篇文章通过单向环形链表的应用实例,详细讲解了约瑟夫环问题的解决方案,并提供了Java代码实现。
21 0
|
1月前
|
存储 缓存
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)(二)
【初阶数据结构】深入解析单链表:探索底层逻辑(无头单向非循环链表)
|
3月前
|
存储 Java
|
3月前
|
存储 Java
java实现单链表的创建、增、删、改、查
这篇文章详细介绍了Java中如何实现单链表的创建以及对单链表进行增加、删除、修改、查询等操作的方法,并提供了相应的代码示例。
java实现单链表的创建、增、删、改、查
|
3月前
|
存储 Java
【Java集合类面试十】、HashMap中的循环链表是如何产生的?
在多线程环境下,HashMap在扩容时如果发生条件竞争,元素的插入顺序可能形成循环链表,导致死循环。
|
3月前
|
存储 Java
java实现双向链表的增删改查
这篇文章展示了如何在Java中实现双向链表的增加、删除、修改和查询操作,并通过代码示例演示了在双向链表中存储和操作学生信息的过程。
下一篇
无影云桌面