题目
反转一个单链表
实现
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; else tmp = 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