1. 程式人生 > >多種單鏈表反轉面試題總結

多種單鏈表反轉面試題總結

public class Main {
	public static void main(String[] args) {
		ListNode head = new ListNode(3);
		ListNode node1 = new ListNode(5);
		ListNode node2 = new ListNode(6);
		ListNode node3 = new ListNode(9);
		ListNode node4 = new ListNode(7);
		ListNode node5 = new ListNode(2);
		ListNode node6 = new ListNode(1);
		ListNode node7 = new ListNode(12);
		head.next = node1;
		node1.next = node2;
		node2.next = node3;
		node3.next = node4;
		node4.next = node5;
		node5.next = node6;
		node6.next = node7;
		printList(head);
//		printList(reverseNode(head));
//		printList(reverseKgroups(head, 3));
		printList(reverseKgroup(head, 3));

	}

	// 列印連結串列的方法,方便test函式
	public static void printList(ListNode head) {
		while (head != null) {
			System.out.print(head.val + " ");
			head = head.next;
		}
		System.out.println();
	}
	/**
	 * 分組反轉單鏈表,最後不足K個節點的部分不反轉
	 * @param head
	 * @param k
	 * @return
	 */
	public static ListNode reverseKgroups(ListNode head, int k) {
		if (head == null)
			return head;
		ListNode cur = head;
		ListNode reHead = null;

		int count = 0;
		if (getSize(cur) >= k) {
			/* Reverse first k nodes of linked list */
			while (count < k && cur != null) {
				ListNode reCur = cur;
				cur = cur.next;
				reCur.next = reHead;
				reHead = reCur;
				count++;
			}
			/*
			 * cur is now a pointer to (k+1)th node Recursively call for the
			 * list starting from current. And make rest of the list as next of
			 * first node
			 */
			if (cur != null)
				head.next = reverseKgroups(cur, k);
			return reHead;
		}
		return cur;
	}

	/**
	 * 分組反轉單鏈表,最後不足K個節點的部分也反轉
	 * @param head
	 * @param k
	 * @return
	 */
	public static ListNode reverseKgroup(ListNode head, int k) {
		if (head == null)
			return head;
		ListNode cur = head;
		ListNode reHead = null;

		int count = 0;
		/* Reverse first k nodes of linked list */
		while (count < k && cur != null) {
			ListNode reCur = cur;
			cur = cur.next;
			reCur.next = reHead;
			reHead = reCur;
			count++;
		}
		/*
		 * cur is now a pointer to (k+1)th node Recursively call for the
		 * list starting from current. And make rest of the list as next of
		 * first node
		 */
		if (cur != null)
			head.next = reverseKgroup(cur, k);
		
		return reHead;
	}
	/**
	 * 統計該節點之後的節點數量
	 * @param head
	 * @return
	 */
	public static int getSize(ListNode head) {
		int count = 0;
		ListNode curNode = head;
		while (curNode != null) {
			count++;
			curNode = curNode.next;
		}
		return count;
	}
	


	/*
	 * 翻轉連結串列(遍歷) 從頭到尾遍歷原連結串列,每遍歷一個結點, 將其摘下放在新連結串列的最前端。 注意連結串列為空和只有一個結點的情況。時間複雜度為O(n)
	 */
	public static ListNode reverseNode(ListNode head) {
		// 如果連結串列為空或只有一個節點,無需反轉,直接返回原連結串列表頭
		if (head == null || head.next == null)
			return head;

		ListNode reHead = null;
		ListNode cur = head;
		while (cur != null) {
			ListNode reCur = cur; // 用reCur儲存住對要處理節點的引用
			cur = cur.next; // cur更新到下一個節點
			reCur.next = reHead; // 更新要處理節點的next引用
			reHead = reCur; // reHead指向要處理節點的前一個節點
		}
		return reHead;
	}

}
class ListNode {
      int val;
      ListNode next;
      ListNode(int x) { val = x; }
}



相關推薦

多種單鏈反轉試題總結

public class Main { public static void main(String[] args) { ListNode head = new ListNode(3); ListNode node1 = new ListNode(5); ListNode node2 = new

**單鏈試題 (一)**

本文是我關於單鏈表的一些面試題的理解。有不正確的請批評指正。主要有: 1  單鏈表從尾到頭列印:(遞迴與非遞迴方式) 遞迴方式實現單鏈表從尾到頭列印:要實現長度為k的連結串列從尾到頭列印;,若長度為k-1的單鏈表從尾到頭列印已知,只需要列印最後一個結點,再從尾到頭列印長度

**單鏈試題(二)**

        本文緊跟上一篇部落格,主要是我對單鏈表面試題的一些理解。         6  氣泡排序        主要分三步:1 比較相鄰的兩個數,如果後邊

java經典試題單鏈反轉問題詳解(含遞迴法)

java經典面試題:單鏈表反轉問題,有兩種方法,一種為迴圈遍歷法,一種遞迴法。 1、迴圈遍歷法   首先設定三個節點,把當前節點的下一節點指向它前面的節點,此時你會發現指標鏈會斷,所以要先把它後面一個節點用nextNode儲存下來,之後把節點向後移動遍歷即可。    程式碼如下: //

單鏈反轉,返回反轉後連結串列頭結點--360測試實習生試題

為了正確反轉一個連結串列,需調整指標指向,例如i,m,n是3個相鄰結點,假設結點i之前的指標已調整完畢,,這些結點的next指標都指向前面一個結點,遍歷到結點m時,需要調整結點的next指標,避免連結串列斷開,在調整之前需儲存n,然後找反轉後連結串列的頭結點(即原連結串列的尾

單鏈反轉(三種方法總結

題目:輸入一個連結串列,反轉連結串列後,輸出連結串列的所有元素。 方法一: 思路:從原連結串列的頭部一個一個取節點並插入到新連結串列的頭部 (1) struct ListNode{ int val; struct ListNode *nex

單鏈反轉

循環 col 過程 str oid public 技術 next() 臨時 1定義 單鏈表node的數據結構定義如下: class Node { // 註:此處的兩個成員變量權限不能為private,因為private的權限是僅對本類訪問

九章算法-試題總結(算法、強化算法、系統設計高清視頻觀看)

1 落單的數 題目描述: 有2n+1個數,其中2n個數兩兩成對,1個數落單,找出這個數。要求O(n)的時間復雜度,O(1)的空間復雜度。 進階問題:如果有2n+2個數,其中有2個數落單,該怎麽辦? 分析 初階:將2n+1個數異或起來,相同的數會

Linux試題總結

linux面試題(部分試題為網上摘錄)1、/var/log/messages日誌中找到相關信息:kernel: nf_conntrack: table full, dropping packet。出現這些信息會導致什麽後果?該如何解決?(此試題為網上他人總結,自己拿來學習)解答:這個報錯意思是,連接跟蹤表已滿

http協議試題總結

基於 value field 發送 數據 nbsp 常數 面試 http協議 一、http協議基於tcp協議 當瀏覽器需要從服務器獲取數據時 那麽就會發送一個http請求 這時 http請求會通過tcp建立一個服務器通道 請求後會斷開連接進入無畏狀態 所以htt

入我新美大的Java後臺開發試題總結

情況 查詢優化 做什麽 工作 我認 人的 方便 xpl 別人   靜兒最近在總結一些面試題,那是因為做什麽事情都要認真。面試也一樣,靜兒作為新美大金融部門的面試官,負責任的告訴大家,下面的問題回答不上來,面試是過不了的。不過以下絕不是原題,你會發現自己實力不過硬,最終肯定是

shell試題總結

用戶 date adduser /dev/null dir then light /dev/ lin 1.寫一個腳本,實現判斷10.0.0.0/24網絡裏,當前在線用戶的IP有哪些(方法有很多) #!/bin/sh for n in `seq 254` do pin

Java後臺開發試題總結

情況 swap sql 行數 his 本地方法棧 特性 jndi buffer 1>如何定位線上服務OOM問題  2>JVM的GC ROOTS存在於那些地方 3>mysql innodb怎樣做查詢優化 4>java cas的概念 Java服務OO

Linux驅動試題總結

失敗 產生 ip協議 函數 原子 名稱 有助於 方式 單處理器 1、 Linux設備中字符設備與塊設備有什麽主要的區別?請分別列舉一些實際的設備說出它們是屬於哪一類設備。 字符設備:字符設備是個能夠像字節流(類似文件)一樣被訪問的設備,由字符設備驅動程序來實現這種特

Java高級工程師試題總結及參考答案

排序算法 move ner 隔離級別 這一 aid 是我 分析 操作 一、面試題基礎總結 1、 JVM結構原理、GC工作機制詳解 答:具體參照:JVM結構、GC工作機制詳解 ,說到GC,記住兩點:1、GC是負責回收所有無任何引用對象的內存空間。 註意:垃圾回收回收的

試題:總結 !=!=未看

row 使用遞歸 ocl object 作者 rand col cat 完全 一、如何比較兩個對象,比如學生類,根據屬性年齡比較大小 參考:http://zhidao.baidu.com/link?url=0eh3YqTJGUd0Kp9R_YM3q2sh2A39

試題:各大公司Java後端開發試題總結 !=!未看

array water 沒有 引用 run 模塊 transacti 速度 相關 ThreadLocal(線程變量副本) Synchronized實現內存共享,ThreadLocal為每個線程維護一個本地變量。 采用空間換時間,它用於線程間的數據隔離,為每一個使用該變量的線

再說單鏈反轉

AD status ini light save link class ret cpp struct Node{ Value data; Node* next; } Node* ReverseSingleLinkedList(No

2018年大數據試題總結

shuff 排序 2018年 split t對象 默認 數據庫 cmp one 目前面試了多家大數據開發工程師,成長了很多,也知道了很多知識,下面和大家分享一下我遇到的面試題和答案。 1.kafka集群的規模,消費速度是多少。 答:一般中小型公司是10個節點,每秒20M左右

試題總結

onload nbsp scrip 哪些 對象 面試題總結 AS 判斷 frame Css篇: 1、CSS實現寬度自適應100%,寬高16:9的比例的矩形。 JS篇: 1、iframe的缺點有哪些? iframe會阻塞主頁面的Onload事件; 搜索引擎的檢索程序無