java 单链表反转
因为面试考到了一些算法,也都忘的差不多了,学习了单链表之后,想把内容下来。这篇文章主要介绍什么是单链表以及单链表的反转方式:
链表定义:
链表是一种递归的数据结构,它或者为空(null),或者是指向一个结点(node)的引用,该结点含有一个泛型的元素和一个指向另一条链表的引用。
我的理解就是:链表是由一个一个的结点组成,结点呢,是由一个元素和一个指向另一个结点的引用组成。举个例子,火车就好比一条链表,一节一节的车厢就是结点。车厢里面的人就是结点中存在的元素,1号车厢连接2号车厢即1个结点指向下一个结点。
结点抽象成代码就是:
private class Node{
Item item;
Node next;
}
一个Node对象包含两个实例变量,类型分别为Item(参数类型)和Node。
我们通过new Node()触发构造函数来创建一个Node类型的对象。调用的结果是一个指向Node对象的引用,它的实例变量均被初始化为null。
如何定义一个节点:
private class Node{
int data;//数据域 ,(参数类型为int)
Node next;//指针域
//传数据域的构造函数
public Node(int data) {
this.data = data;
}
//省略get set
...
}
如何反转单链表
1.递归反转
递归反转的思想:
在反转一个结点前先反转下一个结点,将尾结点作为头结点。
实现代码:
public class Reverse {
public static void main(String[] args){
Node head = new Node(0);//第一个结点,即头结点
Node node1 = new Node(1);//头结点之后的第一个结点
Node node2 = new Node(2);
Node node3 = new Node(3);
Node tail = new Node(4);//尾结点
//设置指针域
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(tail);
//从头结点开始循环打印
Node node = head;
while (node!=null){
System.out.println(node.getData());
node = node.getNext();
}
head = reverse(head);
System.out.println("反转后的打印结果");
while (head!=null){
System.out.println(head.getData());
head = head.getNext();
}
}
//递归反转
public static Node reverse(Node head){
// head看作是前一结点,
// head.getNext()是当前结点
// reHead是反转后新链表的头结点
if (head == null || head.getNext() == null) {
// 若为空链或者当前结点在尾结点,则直接还回
return head;
}
Node last = reverse(head.getNext());// 先反转head的下一个结点
head.getNext().setNext(head);// 将当前结点指向前一结点
head.setNext(null);// 前一结点的指针域令为null;
return last;// 反转后新链表的头结点
}
}
2.非递归反转