1. 程式人生 > >單鏈表反轉(兩種方式)-----java版

單鏈表反轉(兩種方式)-----java版

        曾經面試時遇到過這個問題,發現網上關於該問題的內容挺多的,但是很少有能直接看到反轉效果的,為此我寫了一個小demo,供大家參考:

package com.nrsc.Demo;
/**
 * 
 * @author 孫川----單鏈表反轉問題
 *
 */

public class LinkedDemo {

	// -----節點對應的資料結構-------
	private class ListNode {
		int val;
		ListNode next;

		ListNode(int x, ListNode next) {
			this.val = x;
			this.next = next;
		}

		ListNode(int x) {
			this(x, null);
		}
	}

	// -----節點對應的資料結構-------

	// 連結串列頭
	private ListNode head;

	// 向連結串列頭新增元素
	public void addFirst(int i) {
		if (head == null) {
			head = new ListNode(i);
			return;
		}

		head = new ListNode(i, head);
	}

	// 遍歷整個連結串列
	public void look() {
		if (head == null)
			return;
		ListNode tmp = head;
		while (tmp != null) {
			System.out.print(" " + tmp.val);
			tmp = tmp.next;
		}
	}

	// 反轉連結串列 ---- 方法一:迭代法
	public void reverse() {
		head = reverseList(head);
	}

	// 注意這裡的header是形參和本類中的連結串列頭head不是一個,為了區分我加了個er
	// 下面這段程式碼,畫個圖可以很容易的進行理解
	private ListNode reverseList(ListNode header) {

		if (header == null || header.next == null)
			return header;

		ListNode reverse = reverseList(header.next);

		header.next.next = header;
		header.next = null;

		return reverse;
	}

	// 反轉連結串列 ---- 方法二:指標挪動
	public void reverse2() {
		head = reverseList(head);
	}

	public ListNode reverseList2(ListNode header) {

		if (header == null || header.next == null)
			return header;

		// 將頭賦給pre
		ListNode pre = header;
		// 現在的指標
		ListNode cur = header.next;

		// 如果現在的節點不是null,就繼續遍歷
		while (cur != null) {
			ListNode tmp = cur.next; // 臨時變數
			// 將現在的指標指向前一個
			cur.next = pre;

			// 向後挪動指標
			pre = cur;
			cur = tmp;
		}
		// 別忘了將原來的頭指標指向null
		header.next = null;

		return cur;

	}

	public static void main(String[] args) {
		LinkedDemo link = new LinkedDemo();

		for (int i = 4; i > 0; i--)
			link.addFirst(i);
		System.out.println("反轉前:");
		link.look();

		System.out.println();
		System.out.println("迭代法反轉後:");
		link.reverse();
		link.look();

		System.out.println();
		System.out.println("再次用指標移動法進行反轉後:");
		link.reverse2();
		link.look();

	}

}

順便貼一下執行結果吧:

相關推薦

單鏈反轉(方式)-----java

        曾經面試時遇到過這個問題,發現網上關於該問題的內容挺多的,但是很少有能直接看到反轉效果的,為此我寫了一個小demo,供大家參考: package com.nrsc.Demo; /** * * @author 孫川----單鏈表反轉問題 * */

java建立單鏈方式

/** * */ /** * @author jueying: * @version 建立時間:2018-10-23 下午01:26:47 * 類說明 */ /** * @author jueying * */ public class Test {

Hibernate學習筆記(一)之——根據配置檔案自動建立方式(註解方式和配置檔案方式

環境準備:jdk  eclipse   hibernate、mysql jar包 專案截圖: Student是根據配置檔案建立表,Teacher是根據註解建立表 Student.java package com.java1234.model; publi

單鏈是否有環(Java

題目:判斷一個帶頭結點的單鏈表L是否有環 解題思路: 咋看之下,這題還真不好解,於是又一些投機取巧的人,在訪問單鏈表中元素的時候,用一個比較大的數N控制訪問元素的個數,他們認為如果在訪問到第N個元素之

建立單鏈方法

*建立單鏈表的方法* 頭插法建立單鏈表 個人感覺尾插法更容易理解= =頭插法看了好久才看懂(mock上的課不錯,這裡的程式碼就來自上面的老師的課件,大部分註釋是我自己的理解) #include <iostream> using namespac

spark-shell 資料檔案 讀成 方式!!! 相對路徑!!hdfs dfs -ls

park SQL應用 Spark Shell啟動後,就可以用Spark SQL API執行資料分析查詢。 在第一個示例中,我們將從文字檔案中載入使用者資料並從資料集中建立一個DataFrame物件。然後執行DataFrame函式,執行特定的資料選擇查詢。 文字檔案cu

單鏈就地逆置(Java

題目:有一個線性表(a1,a2,a3,...,an),採用帶頭節點的單鏈表L儲存,設計一個演算法將其就地逆置,線性表變為(an,...a3,a2,a1)。所謂“就地”指輔助儲存空間為O(1)。

遞迴和迭代方式實現歸併排序(Java

遞迴版 package MergeSort; import Utils.SortUtils; /** * 歸併排序遞迴版 * @author liguodong */ pub

java中線性實現方式區別

注意:線性表的兩種實現->順序實現和鏈式實現 線性表的兩種實現 順序表 連結串列 空間效能 順序表的儲存空間是靜態分佈的,需要一個固定的陣列,總有部分陣列元素要浪費 連結串列的儲存空間是動態分佈,因此不會有空間被浪費。但由於連結串列需要額外的空間來

java及javascript方式獲取YYYY-MM-dd HH:mm:ss格式的日期字符串

con javascrip var ear second -c form imp minutes 一、java方式 String leaveTime=""; SimpleDateFormat sDateFormat=new SimpleDateFormat("YYYY-M

瀏覽器原生 form 單POST 數據的方式

mes 但是 lba lose -s ipa mvm 默認 字串 我們在提交表單的時候,form表單參數中會有一個enctype的參數。enctype指定了HTTP請求的Content-Type。 常用有兩種:application/x-www-form-urlencod

form單提交的方式

btn border 前端 () input onclick sub 輸入 判斷 1.當輸入用戶名和密碼為空的時候,需要判斷。這時候就用到了校驗用戶名和密碼,這個需要在jsp的前端頁面寫;有兩種方法,一種是用submit提交。一種是用button提交。方法一:在jsp的前端

java基礎——java類復用的方式及多態

br0 tm4 rss java 復用 ref lan 兩種 vpx Ik2L卮F3w8仄http://t.docin.com/zdto79252 釋7心ND綠誆3叢毯顧http://t.docin.com/wmmo108 欽uvPX勸盜TJZ口http://t.doc

讀取數據庫配置信息的方式(以後開發項目用java鏈接數據庫)-------java基礎知識

dmi 信息 bsp lock 開發 res port src font 第一步:先建立jdbc.properties 1 user=root 2 password=123456 3 url=mysql:jdbc://localhost:3306/yanlong 4 d

Java中實現多線程的方式

窗口 -- his 面向對象 new thread 資源 pub string /** * 使用Thread類模擬4個售票窗口共同賣100張火車票的程序 * * 沒有共享數據,每個線程各賣100張火車票 * * @author jiqinlin * */pu

java中數組復制的方式

ava log brush class div 方法 () print str 在java中數組復制有兩種方式: 一:System.arraycopy(原數組,開始copy的下標,存放copy內容的數組,開始存放的下標,需要copy的長度);   這個方法需要先創建一個空的

Java並發編程:線程間協作的方式:wait、notify、notifyAll和Condition

消費者 CI 能夠 .com stat consumer 使用 producer imp 原文鏈接 Java並發編程:線程間協作的兩種方式:wait、notify、notifyAll和Condition 在前面我們將了很多關於同步的問題,然而在現實中,需要線程之間的協作。比

Java代碼加密的方式,防止反編譯

java加密使用Virbox Protector對Java項目加密有兩種方式,一種是對War包加密,一種是對Jar包加密。Virbox Protector支持這兩種文件格式加密,可以加密用於解析class文件的java.exe,並且可以實現項目源碼綁定制定設備,防止部署到客戶服務器的項目被整體拷貝。兩種加密方

Java異常關閉資源的方式

tst ack date tno 都在 output catch AC all try-catch-finally 常用,在異常關閉時應判斷流是否為空 public class CloseableUtils { public static void closeab

Java多線程Thread使用匿名內部類創建的方式

[] thread sys thread類 main 構造 nbsp ide current 匿名內部類實現線程的兩種方式: 第一種方式: 1.繼承Thread類 2.重寫run方法 3.將要執行的代碼寫在run方法中 第二種方式: 1.將Runnable的