1. 程式人生 > >反轉連結串列的Java實現

反轉連結串列的Java實現

public class ReverseSingleList
{
	/**
	 * 遞迴,在反轉當前節點之前先反轉後續節點
	 * 
	 * @param head
	 * @return
	 */
	public static Node reverse(Node head)
	{
		if (null == head || null == head.getNextNode())
		{
			return head;
		}
		//
		Node reversedHead = reverse(head.getNextNode());
		//
		head.getNextNode().setNextNode(head);
		//
		head.setNextNode(null);
		return reversedHead;
	}

	/**
	 * 遍歷,將當前節點的下一個節點快取後更改當前節點指標
	 * 
	 * @param head
	 * @param mode
	 *            僅用作區分於同名方法
	 * @return
	 */
	public static Node reverse(Node head, int mode)
	{
		if (null == head)
		{
			return head;
		}
		Node pre = head;
		Node cur = head.getNextNode();
		Node next;
		while (null != cur)
		{
			next = cur.getNextNode();
			cur.setNextNode(pre);
			pre = cur;
			cur = next;
		}

		// 將原連結串列的頭節點的下一個節點置為null,再將反轉後的頭節點賦給head
		head.setNextNode(null);
		head = pre;

		return head;
	}

	public static void main(String[] args)
	{
		Node head = new Node(0);
		Node tmp = null;
		Node cur = null;
		// 構造一個長度為100的連結串列,儲存頭節點物件head
		for (int i = 1; i < 100; i++)
		{
			tmp = new Node(i);
			if (1 == i)
			{
				head.setNextNode(tmp);
			} else
			{
				cur.setNextNode(tmp);
			}
			cur = tmp;
		}

		// for (int i = 0; i < 100; i++)
		// {
		// tmp = new Node(i);
		// if (0 != i)
		// {
		// cur.setNextNode(tmp);
		// }
		// cur = tmp;
		// }
		head = reverse(head, 0);
		//
		while (null != head)
		{
			System.out.print(head.getPosition() + "\n");
			head = head.getNextNode();
		}
	}
}