说到链表的反转,当初第一次接触这个概念的时候,首先想到的办法就是,首先对链表做一个遍历,强行给每个节点记录一个顺序,然后再根据顺序重新构建列表,这种办法虽然可以实现,但是效率不高(主要是取决重新排序生成列表的排序算法复杂度),下面这个办法的算法复杂度仅仅为O(N),附代码
// Java program for reversing the linked list class LinkedList { static Node head; static class Node { int data; Node next; Node( int d) { data = d; next = null ; } } /* Function to reverse the linked list */ Node reverse(Node node) { Node prev = null ; Node current = node; Node next = null ; while (current != null ) { next = current.next; current.next = prev; prev = current; current = next; } node = prev; return node; } // prints content of double linked list void printList(Node node) { while (node != null ) { System.out.print(node.data + " " ); node = node.next; } } public static void main(String[] args) { LinkedList list = new LinkedList(); list.head = new Node( 85 ); list.head.next = new Node( 15 ); list.head.next.next = new Node( 4 ); list.head.next.next.next = new Node( 20 ); System.out.println( "Given Linked list" ); list.printList(head); head = list.reverse(head); System.out.println( "" ); System.out.println( "Reversed linked list " ); list.printList(head); } } |