题目
反转一个单链表
实现
1.(递归法)利用递归思想,从头结点递归遍历到最后一个结点,递归返回最后一个结点并修改指针,使指针指向前一个结点。
2.(移动指针)定义当前结点指针cur,前一个结点指针pre,循环迭代,计算下一个结点指针,每次将当前结点指针反转指向前一个结点。
定义结点:
Node.java
public class Node {public int value;public Node next;public Node(int data) {this.value = data;} }
NodeReverse.java
import java.util.Stack;public class NodeReverse {//===================单链表反转==================//反转,递归思想public static Node reverseRecur(Node node) {if (node == null || node.next == null) {return node;} else {Node nn = reverseRecur(node.next);//下一个节点的指针指向上一个节点node.next.next = node;//断掉当前节点指向下一节点的指针node.next = null;return nn;}}//反转,移动指针public static Node reverseMovePoint(Node node) {//前一个节点指针Node pre = null;//当前节点指针Node cur = node;while (cur != null) {//当前节点的下一个节点Node nextNode = cur.next;//当前节点指向下一个节点的指针反转,指向前一个节点cur.next = pre;//当前节点变前一个(pre)节点,前一个节点的指针指向当前节点pre = cur;//下一个节点变当前(cur)节点,当前节点指针指向下一个节点cur = nextNode;}return pre;}//==================倒着打印链表=====================//递归倒着打印public static void printTailRec(Node node){if (node.next ==null){System.out.print(node.value + " ");return;} else {printTailRec(node.next);}System.out.print(node.value + " ");}//遍历,用栈存储,倒着打印public static void printTailStack(Node node){Stack<Node> stack = new Stack<Node>();if (node == null){System.out.println("已经为null");return;}else {while (node != null){stack.push(node);node = node.next;}while (!stack.isEmpty()){System.out.print(stack.pop().value + " ");}}}//打印单链表public static void printLinked(Node head) {Node tmp = head;while (true) {System.out.print(tmp.value + " ");if (tmp.next == null)break;elsetmp = tmp.next;}}public static void main(String[] args) {Node node1 = new Node(1);Node node2 = new Node(2);Node node3 = new Node(3);Node node4 = new Node(4);node1.next = node2;node2.next = node3;node3.next = node4;System.out.println("反转前打印==");printLinked(node1);System.out.println("");Node n = reverseRecur(node1);System.out.println("反转后打印==");printLinked(n);System.out.println("");Node nn = reverseMovePoint(n);System.out.println("再次反转后打印==");printLinked(nn);System.out.println("");//倒着打印链表System.out.println("倒着打印链表");printTailRec(node1);System.out.println("");printTailStack(node1);} }
输出结果:
反转前打印==
1 2 3 4
反转后打印==
4 3 2 1
再次反转后打印==
1 2 3 4
倒着打印链表
4 3 2 1
4 3 2 1