博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java单向链表反转
阅读量:6494 次
发布时间:2019-06-24

本文共 1805 字,大约阅读时间需要 6 分钟。

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

为什么迭代更常用呢?

转载地址:http://mruyo.baihongyu.com/

你可能感兴趣的文章
xshell 远程连接Linux
查看>>
【IOS】IOS8 TabBarItem设置自定义图片问题
查看>>
Linux计划任务及压缩归档(week2_day1)--技术流ken
查看>>
ccf算法模板
查看>>
实践案例 | 数据可视化报表应用
查看>>
微信小程序登录 该死的官方文档TypeError: the JSON object must be str, not 'bytes'
查看>>
VMware 虚拟机克隆 CentOS 6.5 之后,网络配置问题的解决方案
查看>>
Python ( 1 ) ----- 简介
查看>>
[linux基础学习]run level
查看>>
第七周学习总结
查看>>
一步步的教你安装UChome (UChome 安装教程)
查看>>
[DeeplearningAI笔记]序列模型1.5-1.6不同类型的循环神经网络/语言模型与序列生成...
查看>>
P2533 [AHOI2012]信号塔
查看>>
Android电话拨号器(uri格式)与四种设置点击事件的方法
查看>>
java web中对json的使用
查看>>
TYVJ P1051 选课 Label:多叉转二叉&&树形dp(虐心♥)
查看>>
将数据库中提取出来的数据在后台进行分页处理
查看>>
bzoj1034
查看>>
百度地图 鼠标绘制,获取矩形,多边形的顶点经纬度
查看>>
回文树模板
查看>>