多種單鏈表反轉面試題總結
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事件; 搜索引擎的檢索程序無