给定(已生成)一个带表头结点的单链表,设head为头指针,结点的结构为(data,next),data为整型元素,next为指针,试写出算法:按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。(要求:不允许使用数组作辅助空间)
package datastructure;
/**
* 给定(已生成)一个带表头结点的单链表,设head为头指针,结点的结构为(data,next),data为整型元素,next为指针,试写出算法:
* 按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间。(要求;不允许使用数组作辅助空间)
*
* @author gejing
*
*/
public class Demo002 {
public static void main(String[] args) {
// 构造一个单向链表
Node head = new Node();
Node temp;
Node currentNode = head;
for (int i = 0; i < 10; i++) {
temp = new Node((int) (Math.random() * 100));
currentNode.next = temp;
currentNode = currentNode.next;
}
// 显示链表内容
show(head);
Demo002 demo002 = new Demo002();
System.out.println("按从小到大输出");
while (head.next != null) {
demo002.findMin(head);
show(head);
}
}
/**
* print the linklist
*/
public static void show(Node head) {
Node currentNode = head.next;
if (currentNode == null) {
System.out.println("链表为空(没有删除头结点)");
}
while (currentNode != null) {
System.out.print(currentNode.data + " ");
currentNode = currentNode.next;
}
System.out.println();
}
/**
* 找出当前链表的最小数据结点,输出其数据并删除该结点
*/
public void findMin(Node head) {
Node currentNode = head.next;// 当前工作结点
Node currentPre = head;// 当前结点的直接前驱
Node minNodePre = null;// 记录最小结点的直接前驱
if (currentNode == null) {
System.out.println("The linklist is empty");
return;
}
int min = Integer.MAX_VALUE;
while (currentNode != null) {
if (currentNode.data <= min) {
minNodePre = currentPre;
min = currentNode.data;
}
currentPre = currentPre.next;
currentNode = currentNode.next;
}
System.out.println("min: " + min + " 并删除该结点");
// 删除最小结点
minNodePre.next = minNodePre.next.next;
System.gc();
}
}
(使用p.next.data可以少声明一个变量)