链表的反转的三种方法

时间:2025-03-25 20:10:05
package com.javase.reverselink; public class ReverseLink { public static void main(String[] args) { Node<Integer> head =buildLink(); Node<Integer> newNode =recursiveReverseLink(head); print(newNode); } public static Node<Integer> reverseLink(Node<Integer> head){ //提前判断,如果链表的长度为0或1,则不需要反转 if(head==null||head.next==null){ return head; } //需要三个变量进行控制 Node<Integer> preNode =null; Node<Integer> currentNode =head; Node<Integer> nextNode = head.next; //执行反转 currentNode.next = preNode; //循环反转 while (nextNode!=null){ //整体移动 preNode =currentNode; currentNode=nextNode; nextNode=currentNode.next; //执行反转 currentNode.next = preNode; if(nextNode==null){ head=currentNode; } } return head; } /** * 使用递归的方式进行链表反转 * @param head 旧的链表的头结点 * @return 反转后的链表的头结点 */ public static Node<Integer> recursiveReverseLink(Node<Integer> head){ //退出机制 if(head == null || head.next ==null){ return head; } //分成两个部分 1.一个结点 2、后边已经反转成功的链表 Node<Integer> newHead = recursiveReverseLink(head.next); //核心的反转逻辑 head.next.next=head; head.next=null; return newHead; } public static Node<Integer> headInsertReserveLink(Node<Integer> head){ if(head==null||head.next==null){ return head; } Node<Integer> temp = null,newHead=null; while(head!=null){ temp=head; head=head.next; temp.next=newHead; newHead =temp; } return newHead; } /** * 用来遍历打印链表的数据 * @param head */ public static void print(Node<Integer> head){ Node<Integer> current = head; while(current!=null){ System.out.println(current.t); current=current.next; } } public static Node<Integer> buildLink(){ Node<Integer> head = new Node<>(1); Node<Integer> node2 = new Node<>(2); Node<Integer> node3 = new Node<>(3); Node<Integer> node4= new Node<>(4); Node<Integer> node5 = new Node<>(5); head.next=node2; node2.next=node3; node3.next=node4; node4.next=node5; return head; } private static class Node<T>{ private T t; private Node<T> next; public Node(T t){ this.t=t; } } }