鏈表面試練習習題集(Java)

1.

思路:

因為楊輝三角是由二維數組構成,所以要先創建一個二維數組,如何用順序表表示二維數組,可以通過List<List<Interger>>來表示一個二維數組,可以這樣理解:先創建一個一維數組List,然后這個一維數組里面存放的元素類型是:<List<Integer>>,即接收整型的一維數組,所以一個一維數組中每個元素存的還是一維數組,那么就相當于二維數組了。

然后楊輝三角每行的第一列為1,則add(1)即可,中間為上一行對齊的兩個元素之和,所以要先通過對二維數組get得到上一行的數組,再通過對上一行的數組get得到對齊的那兩個元素,最后將和add到這一行的一維數組里,如此類推

最后每一行的最后一列元素也是1,因為add的底層實現是尾插,所以我們直接add(1)即可,最后再將這一行的一維數組add到二維數組里

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> list=new ArrayList();//二維數組List<Integer> list1=new ArrayList<>();//一維數組list1.add(1);list.add(list1);for (int i = 1; i < numRows; i++) {//第一列List<Integer> curRow=new ArrayList<>();curRow.add(1);//中間List<Integer> preRow=list.get(i-1);for (int j = 1; j < i; j++) {int a=preRow.get(j-1);int b=preRow.get(j);curRow.add(a+b);}//最后一列curRow.add(1);list.add(curRow);}return list;}
}

2.

思路:

看到求中間的東西,大概率會用到快慢指針,即當慢指針走一步,快指針走兩步,當快指針到達終點時,慢指針剛好在中間,因為很簡單的公式:路程=速度*時間;時間t相等,v快=2v慢,s=v快*t,v慢*t=1/2s

當結點為奇數個數時,剛好為中間的結點,當結點為偶數個數,為中間的第二個結點,根據快慢指針一個走兩步,一個走一步,剛剛好都滿足,所以就不用分類討論了

什么時候停止指針移動呢,根據示例1和2,在示例1中,當快指針在5這里停止,在示例2中,當快指針在6的后面(即null)這里停止,所以循環條件為fast!=null&&fast.next!=null,注意&&前后兩個條件不能換,必須先fast!=null再fast.next!=null,因為互換的話,當fast==null時,fast.next會報異常

class Solution {public ListNode middleNode(ListNode head) {if(head==null){return head;}ListNode slow=head;ListNode fast=head;while(fast!=null&&fast.next!=null){slow=slow.next;//走一步fast=fast.next.next;//走兩步}return slow;}
}

3.

思路:

需要兩個指針,一個記錄當前結點cur,一個記錄前面的那個結點precur,一開始都指向頭結點head。如果cur的val等于傳入的val,則先將cur往后移動一位,然后precur.next指向cur;否則precur走到cur的位置,cur往后移一步,循環條件為cur!=null,這是一般情況的代碼

如果一開始頭結點就等于val,即示例3的情況,那么按照上面的代碼就不能將頭結點移除,所以我們要判斷一開始頭結點是否為val,如果為val,則新頭結點為頭結點的后一個,因為移除完后的新頭結點有可能仍然等于val,所以不是用if而是while,如果頭結點為null,則說明全是val,如示例3的情況,此時就返回新頭結點(也就是null)

一般都是先考慮正常情況,然后再來考慮特殊情況

class Solution {public ListNode removeElements(ListNode head, int val) {if(head==null){return head;}//解決一開始頭結點的值就為valwhile(head.val==val){head=head.next;if(head==null){return head;}}//說明此時頭結點一定不為valListNode cur=head;//當前結點ListNode precur=head;//前結點while(cur!=null){if(cur.val==val){cur=cur.next;precur.next=cur;}else{precur=cur;cur=cur.next;}}return head;}
}

4.

思路:

因為是反轉,所以可以確定的是,第一個結點反轉后一定是最后一個結點,所以我們要將頭結點的next改為null,但改之前要記錄頭結點的下一個結點。然后采用每遍歷一個結點就進行頭插,即該結點cur的next指向頭結點,但修改next的指向時,要先將原來的next指向的結點進行保存,保存到curN,然后頭插完,cur=curN,循環條件為cur!=null

class Solution {public ListNode reverseList(ListNode head) {if(head==null){return head;}//必要處理ListNode cur=head.next;//第一步:記錄頭結點的next結點head.next=null;//第二步:頭結點的next改為null//循環遍歷,使用頭插while(cur!=null){ListNode curN=cur.next;//循環中的第一步:記錄下一個結點cur.next=head;//第二步:當前結點頭插到頭結點之前head=cur;//第三步:新的頭結點為當前結點cur=curN;//第四步:當前結點后移到原來的下一個結點位置}return head;}
}

5.

思路:

法一:可以利用我們剛剛上面那道題的代碼,先將鏈表反轉,再遍歷第k個結點即可

法二:遍歷兩次,第一次求長度len,第二次遍歷到第len-k個結點即可

法三:利用集合順序表arraylist,遍歷一次,用add將里面所有的元素放進順序表里,然后再get(arraylist.size()-k)即可

法四:快慢雙指針,先提前讓快指針走k步,然后慢指針和快指針以相同的速度每次走一步,當快指針走到最后時,慢指針的位置即為倒數第k個結點

示例代碼(法一)

class Solution {public int kthToLast(ListNode head, int k) {if(head==null){return -1;}//反轉鏈表ListNode cur=head.next;head.next=null;while(cur!=null){ListNode curN=cur.next;cur.next=head;head=cur;cur=curN;}//然后找ListNode node=head;for(int i=1;i<k;i++){node=node.next;}return node.val;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46287.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46287.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46287.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

modbus slave 設備通過 網關thingsboard-gateway 將數據上傳到thingsboard云平臺

搭建thingsboard物聯網云平臺花了大量時間&#xff0c;從小白到最后搭建成功&#xff0c;折磨了好幾天&#xff0c;也感謝網友的幫助&#xff0c;提供了思路最終成功搞定&#xff0c;特此記錄。 一、thingsboard環境搭建&#xff08;Ubuntu20.04LTS&#xff09; 參考官方文檔&a…

java之 junit單元測試案例【經典版】

一 junit單元測試 1.1 單元測試作用 單元測試要滿足AIR原則&#xff0c;即 A&#xff1a; automatic 自動化&#xff1b; I: Independent 獨立性&#xff1b; R&#xff1a;Repeatable 可重復&#xff1b; 2.單元測試必須使用assert來驗證 1.2 案例1 常規單元測試 1.…

PSINS工具箱函數介紹——r2d

介紹工具箱里面r2d這個小函數的作用。 程序源碼 function deg r2d(rad) % Convert angle unit from radian to degree % % Prototype: deg r2d(rad) % Input: rad - angle in radian(s) % Output: deg - angle in degree(s) % % See also r2dm, r2dms, d2r, dm2r, dms2r% …

設計模式使用場景實現示例及優缺點(行為型模式——觀察者模式)

阿爾法的身體內部有一個智能芯片&#xff0c;這個芯片能夠根據環境和需求自動改變它的行為模式。當阿爾法需要完成不同任務時&#xff0c;它的內部狀態會發生變化&#xff0c;進而改變它的行為&#xff0c;就像是它變成了另一個機器人一樣。 一天&#xff0c;智能城的市長接到一…

多種方式實現 元素高度絲滑的從0-1顯示出來

選擇合適的方式&#xff0c;給用戶更好的體驗&#xff0c;多種方式實現 元素高度絲滑的從0-1顯示出來。 能用 CSS 實現的動畫&#xff0c;就不要采用 JS 去實現。 1、瀏覽器可以對CSS動畫進行優化&#xff0c;其優化原理類似于requestAnimationFrame&#xff0c;會把每一幀的…

java基礎學習:序列化之 - Fast serialization

在Java中&#xff0c;序列化是將對象的狀態轉換為字節流的過程&#xff0c;以便保存到文件、數據庫或通過網絡傳輸。Java標準庫提供了java.io.Serializable接口和相應的機制來進行序列化和反序列化。然而&#xff0c;標準的Java序列化機制性能較低&#xff0c;并且生成的字節流…

appium2.0 執行腳本遇到的問題

遇到的問題&#xff1a; appium 上的日志信息&#xff1a; 配置信息 方法一 之前用1.0的時候 地址默認加的 /wd/hub 在appium2.0上&#xff0c; 服務器默認路徑是 / 如果要用/wd/hub 需要通過啟動服務時設置基本路徑 appium --base-path/wd/hub 這樣就能正常執行了 方法二…

關于Kafka的17個問題

1.Kafka 的設計時什么樣的呢&#xff1f; Kafka 將消息以 topic 為單位進行歸納 將向 Kafka topic 發布消息的程序成為 producers. 將預訂 topics 并消費消息的程序成為 consumer. Kafka 以集群的方式運行&#xff0c;可以由一個或多個服務組成&#xff0c;每個服務叫做一個…

前端css常用筆記

文章目錄 一、樣式二、vue筆記2.1、組件之間的通信2.1.1 子組件調用父組件的方法2.1.2 父組件調用子組件的方法2.1.3 孫組件調用祖父組件方法的實現 2.2、使用若依時,node_nodules越來越大的問題2.3、echart筆記 一、樣式 1 文字與圖標對不齊的解決方法 /**給icon加上這個樣式即…

mysql的索引事務和存儲引擎

一、索引 1、索引 索引的概念 &#xff1a;索引是一個排序的列表&#xff0c;在列表當中存儲索引的值以及索引值對應數據所在的物理行。 索引的引用&#xff1a; 使用索引之后&#xff0c;就不需要掃描全表來定位某行的數據。 加快數據庫的查詢速度。 索引可以是表中的一…

ubuntu 網絡 通訊學習筆記2

1.ubuntu 網絡常用命令 在Ubuntu中&#xff0c;有許多網絡相關的常用命令。以下是一些主要命令及其用途&#xff1a; ifconfig&#xff1a;此命令用于顯示和配置網絡接口信息。你可以使用它來查看IP地址、子網掩碼、廣播地址等。 例如&#xff1a;ifconfig 注意&#xff1a…

在 K8s 上使用 KubeBlocks 提供的 MySQL operator 部署高可用 WordPress 站點

引言 WordPress WordPress 是全球最流行的內容管理系統&#xff08;CMS&#xff09;&#xff0c;自 2003 年發布以來&#xff0c;已成為網站建設的首選工具。其廣泛的插件和主題生態系統使用戶能夠輕松擴展功能和美化外觀。活躍的社區提供豐富的資源和支持&#xff0c;進一步…

[RK3588-Android12] 關于如何取消usb-typec的pd充電功能

問題描述 RK3588取消usb-typec的pd充電功能 解決方案&#xff1a; 在dts中fusb302節點下usb_con: connector子節點下添加如下熟悉&#xff1a; 打上如下2個補丁 diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index c8a4e57c9f9b..173f8cb7…

使用OpenCV尋找圖像中的輪廓

引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫。它提供了大量的視覺處理功能&#xff0c;包括圖像和視頻捕獲、特征檢測與匹配、圖像變換、圖像分割、顏色空間轉換等。在圖像處理中&#xff0c;尋找圖像中的…

electron項目中實現視頻下載保存到本地

第一種方式&#xff1a;用戶自定義選擇下載地址位置 渲染進程 // 渲染進程// 引入 import { ipcRenderer } from "electron";// 列表行數據下載視頻操作&#xff0c;diffVideoUrl 是視頻請求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…

【數字電路學習新助手】掌握電路仿真軟件,開啟數字電路知識的新篇章

在信息科技日新月異的今天&#xff0c;數字電路知識的重要性不言而喻。無論是通信工程、計算機科學與技術&#xff0c;還是電子信息技術等領域&#xff0c;數字電路都是基礎中的基礎。然而&#xff0c;對于初學者來說&#xff0c;數字電路的學習往往充滿了挑戰。幸運的是&#…

Axure中繼器入門:打造你的動態原型

前言 中繼器 是 Axure 中的一個高級功能&#xff0c;它能夠在靜態頁面上模擬后臺數據交互的操作&#xff0c;如增加、刪除、修改和查詢數據&#xff0c;盡管它不具備真實數據存儲能力。 中繼器就像是一個臨時的數據庫&#xff0c;為我們在設計原型時提供動態數據管理的體驗&a…

中職省培丨2024年大數據技術中職教師專業技能培訓班企業參觀實踐圓滿結束

7月17日&#xff0c;“2024年大數據技術中職教師專業技能培訓班&#xff08;省培&#xff09;”參訓老師蒞臨廣東泰迪智能科技股份有限公司產教融合實訓中心開展企業參觀實踐。泰迪智能科技董事長張良均、中職業務部總監李振林、中職業務部經理黃炳德、校企合作經理吳桂鋒及來自…

centos跳過首次創建用戶

centos跳過首次創建用戶 centos跳過首次創建用戶 在安裝系統后&#xff0c;登錄的時候總是讓新建一個普通用戶&#xff0c;很是煩人&#xff0c;于是想辦法解決一下 方法一 在CentOS上&#xff0c;圖形化登錄&#xff08;如GNOME&#xff09;通常要求您創建一個用戶來登錄。…

.net core appsettings.json 配置 http 無法訪問

1、在appsettings.json中配置"urls": "http://0.0.0.0:8188" 2、但是網頁無法打開 3、解決辦法&#xff0c;在Program.cs增加下列語句 app.UseAntiforgery();