反转一个单链表。

    示例:
    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL

    • 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/reverse-linked-list

    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    1. public class Q206 {
    2. public static void main(String[] args) {
    3. ListNode node = new ListNode(1);
    4. ListNode root = node;
    5. for (int i = 2; i < 6; i++) {
    6. node.next = new ListNode(i);
    7. node = node.next;
    8. }
    9. print(root);
    10. ListNode node1 = new Q206().reverseList(root);
    11. print(node1);
    12. }
    13. // 迭代算法
    14. public ListNode reverseList(ListNode head) {
    15. ListNode pre = null;
    16. ListNode current = head;
    17. while (current != null) {
    18. ListNode tmp = current.next;
    19. current.next = pre;
    20. pre = current;
    21. current = tmp;
    22. }
    23. return pre;
    24. }
    25. // 基于栈的解法
    26. public ListNode reverseList2(ListNode head) {
    27. if (head == null) {
    28. return head;
    29. }
    30. java.util.Stack<Integer> stack = new java.util.Stack<>();
    31. while (head != null) {
    32. stack.push(head.val);
    33. head = head.next;
    34. }
    35. ListNode startNode = new ListNode(stack.pop());
    36. ListNode tmpNode = startNode;
    37. while (!stack.empty()) {
    38. tmpNode.next = new ListNode(stack.pop());
    39. tmpNode = tmpNode.next;
    40. }
    41. return startNode;
    42. }
    43. static class ListNode {
    44. int val;
    45. ListNode next;
    46. ListNode(int x) {
    47. val = x;
    48. }
    49. }
    50. /**
    51. * 辅助方式,输出链表
    52. */
    53. private static void print(ListNode node) {
    54. System.out.print("[");
    55. while (node != null) {
    56. System.out.print(node.val + "->");
    57. node = node.next;
    58. }
    59. System.out.println("]");
    60. }
    61. }