1. 程式人生 > >反轉單向連結串列(reverse a singly linked list)(單個反轉) [# 7]

反轉單向連結串列(reverse a singly linked list)(單個反轉) [# 7]

問題:

給一個單向連結串列,把它從頭到尾反轉過來。比如: a -> b -> c ->d 反過來就是 d -> c -> b -> a 。

這裡講解兩種方法:

第一種方法就是把每個Node按照順序存入到一個stack裡面,這樣,最後面一個就在最上面了。然後,把每一個再取出來,這樣順序就換過來了。

public static Node reverse(Node head) {
	Stack<Node> stack = new Stack<Node>();
	
	// put all the nodes into the stack
	while (head != null) {
		stack.add(head);
		head = head.next();
	}
	
	//reverse the linked list
	Node current = stack.pop();
	head = current;
	while (stack.empty() != true) {
		Node next = stack.pop();
		//set the pointer to null, so the last node will not point to the first node.
		next.setNext(null);
		current.setNext(next);
		current = next;
	}
	
	return head;	
}

第二種方法就是利用兩個指標,分別指向前一個節點和當前節點,每次做完當前節點和下一個節點的反轉後,把兩個節點往下移,直到到達最後節點。
public static Node reverse(Node head) {
	Node previous = null;

	while (head != null) {
		Node nextNode = head.next();
		head.setNext(previous);
		previous = head;
		head = nextNode;
	}
		
	return previous;	
}