package com.zzw.test;
/**
* @program: HashMapTest
* @description: 单向链表反转
* @author: zhaozhenwei
* @create: 2021-05-30 09:43
**/
public class ListInversion {
public static void main(String[] args) {
Node listInversion = createListInversion();
printListInversion(listInversion);
printListInversion(inversion(listInversion));
}
/**
* 链表反转
* currentNode 当前处理的节点
* previous 处理的上一个节点
* next 要处理的下一个节点
* 处理当前节点currentNode时,先判断当前节点是否为null,为null不进行处理
* 不为null时,保存当前节点currentNode的下一个节点next,避免当前节点的下一个节点指向改变后找不到next
* 将当前节点的下一个指针指向之前处理的节点previous,进行翻转,previous初始状态下为null
* 此时要处理的节点currentNode已经处理结束,变成处理的上一个节点,因此使用previous指向当前节点currentNode
* 下一个要处理的节点next也变成 要处理的当前节点currentNode
* @param node
* @return
*/
public static Node inversion(Node node) {
if (null == node) {
throw new RuntimeException("反转链表起始节点不能为null");
}
// 当前节点
Node currentNode = node;
// 上个节点
Node previous = null;
// 下个节点
Node next = null;
while (null != currentNode) {
next = currentNode.next;
currentNode.next = previous;
previous = currentNode;
currentNode = next;
}
return previous;
}
/**
* 打印链表
* @param node
*/
static void printListInversion(Node node) {
Node currentNode = node;
while (null != currentNode) {
System.out.print(currentNode.value + "\t");
currentNode = currentNode.next;
}
System.out.println();
}
/**
* 创建链表
* @return
*/
static Node createListInversion() {
Node n1 = new Node(1);
Node n2 = new Node(2);
Node n3 = new Node(3);
Node n4 = new Node(4);
Node n5 = new Node(5);
n1.setNext(n2);
n2.setNext(n3);
n3.setNext(n4);
n4.setNext(n5);
return n1;
}
}
class Node {
int value;
Node next;
public Node(int value) {
this.value = value;
}
public void setNext(Node next) {
this.next = next;
}
}
06-03
1471
06-26
341
09-10