微软算法100题24 就地逆序单链表

第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 }

 

posted @ 2015-10-26 10:54  蟹粉小笼包  阅读(355)  评论(0编辑  收藏  举报