第24 题:
链表操作,
单链表就地逆置
思路: 本来想拿两个指针分别指向当前节点和上一节点,在向后移动指针的过程中将当前节点的next指针逆向为上一节点,但这样就无法继续向后移动当前节点了。。。。
转换一下思路,对于n各节点,逆序的操作可以分解为把后面n-1个节点逆序,然后再把第一个节点放在已经逆序好的n-1个元素后面就可以了 -> f(n) = [f(n-1), 1] 最后还是回到了递归上。。。
其实递归是不是也可以归于divide&conquer范畴呢?
1 package com.rui.microsoft; 2 3 public class Test24_ReverseLinkList { 4 5 public static void main(String[] args) { 6 Node node1 = new Node(1); 7 Node node2 = new Node(2); 8 node1.next = node2; 9 Node node3 = new Node(3); 10 node2.next = node3; 11 Node node4 = new Node(4); 12 node3.next = node4; 13 Node node5 = new Node(5); 14 node4.next = node5; 15 16 Node last = reverse(node1); 17 System.out.println("Last Node: " + last.value); 18 System.out.print("New Order:"); 19 while(null != node5){ 20 System.out.print(" " + node5.value); 21 node5 = node5.next; 22 } 23 } 24 25 public static Node reverse(Node head){ 26 if(null == head) return null; 27 if(null == head.next) return head; 28 Node last = reverse(head.next); 29 last.next = head; 30 head.next = null; 31 return head; 32 } 33 34 static class Node{ 35 int value; 36 Node next; 37 public Node(int value){ 38 this.value = value; 39 } 40 } 41 }