自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

漫畫:如何找到鏈表的倒數(shù)第n個(gè)結(jié)點(diǎn)?

開發(fā) 前端
給定鏈表的頭結(jié)點(diǎn),但并不知道鏈表的實(shí)際長(zhǎng)度,要求我們找到鏈表的倒數(shù)第n個(gè)結(jié)點(diǎn)。

 

[[347134]]

 

————— 第二天 —————

 

什么意思呢?我們以下面這個(gè)鏈表為例:

 

給定鏈表的頭結(jié)點(diǎn),但并不知道鏈表的實(shí)際長(zhǎng)度,要求我們找到鏈表的倒數(shù)第n個(gè)結(jié)點(diǎn)。

假設(shè)n=3,那么要尋找的結(jié)點(diǎn)就是元素1:

 

如何利用隊(duì)列呢?小灰的思路如下:

1.創(chuàng)建一個(gè)長(zhǎng)度為n的隊(duì)列,遍歷原始鏈表,讓結(jié)點(diǎn)逐一進(jìn)入隊(duì)列:

 

2.當(dāng)隊(duì)列已滿時(shí),讓隊(duì)尾元素出隊(duì),新結(jié)點(diǎn)入隊(duì):

 

3.當(dāng)鏈表全部結(jié)點(diǎn)遍歷完畢時(shí),隊(duì)尾的元素就是倒數(shù)第n個(gè)結(jié)點(diǎn)(因?yàn)殛?duì)列長(zhǎng)度是n):

 

————————————

 

首先,我們創(chuàng)建兩個(gè)指針P1和P2,P1指向鏈表的頭結(jié)點(diǎn),P2指向鏈表的正數(shù)第n個(gè)結(jié)點(diǎn)(也就是例子中的第3個(gè)結(jié)點(diǎn)):

 

接下來,我們讓指針P1和P2同時(shí)循環(huán)右移,每次右移一步,直到指針P2移動(dòng)到鏈表的末尾:

 

此時(shí),由于P2指向鏈表的尾結(jié)點(diǎn),且P1和P2的距離是n-1,因此P1所指的結(jié)點(diǎn)就是我們要尋找的鏈表倒數(shù)第n個(gè)結(jié)點(diǎn):

 

顯然,這個(gè)方法從頭到尾只需要對(duì)鏈表做一次遍歷,而且僅僅使用了兩個(gè)指針,算法的空間復(fù)雜度是O(1)。

 

 

  1. public class NthFromEnd { 
  2.     public static Node findNthFromEnd(Node head, int n){ 
  3.         Node p1 = head; 
  4.         Node p2 = head; 
  5.         //把p2指針移動(dòng)到正數(shù)第n個(gè)結(jié)點(diǎn) 
  6.         for(int i=1; i<n; i++){ 
  7.             p2 = p2.next
  8.             if(p2 == null){ 
  9.                 throw new IllegalArgumentException("參數(shù)n超出鏈表長(zhǎng)度!"); 
  10.             } 
  11.         } 
  12.         //p1和p2一起右移,直到p2指向鏈表尾結(jié)點(diǎn) 
  13.         while (p2.next != null){ 
  14.             p1 = p1.next
  15.             p2 = p2.next
  16.         } 
  17.         return p1; 
  18.     } 
  19.  
  20.     //快速創(chuàng)建鏈表 
  21.     private static Node buildLinkList(int[] array){ 
  22.         Node head = new Node(array[0]); 
  23.         Node p = head; 
  24.         for(int i=1; i<array.length; i++){ 
  25.             p.next = new Node(array[i]); 
  26.             p = p.next
  27.         } 
  28.         return head; 
  29.     } 
  30.  
  31.     //鏈表節(jié)點(diǎn) 
  32.     private static class Node { 
  33.         int data; 
  34.         Node next
  35.  
  36.         Node(int data) { 
  37.             this.data = data; 
  38.         } 
  39.     } 
  40.  
  41.     public static void main(String[] args) { 
  42.         int[] inputs = {5,3,7,2,4,1,9,8}; 
  43.         Node head = buildLinkList(inputs); 
  44.         Node node = findNthFromEnd(head,3); 
  45.         System.out.println("鏈表倒數(shù)第3個(gè)元素是:" + node.data); 
  46.     } 
  47.  

本文轉(zhuǎn)載自微信公眾號(hào)「程序員小灰」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序員小灰公眾號(hào)。

 

 

責(zé)任編輯:武曉燕 來源: 程序員小灰
相關(guān)推薦

2021-08-10 07:57:03

算法鏈表倒數(shù)

2022-01-17 09:23:02

LeetCode刪除鏈表算法

2021-04-14 10:19:18

鏈表倒數(shù)結(jié)點(diǎn)

2021-02-03 13:23:42

鏈表倒數(shù)結(jié)點(diǎn)

2022-06-01 06:58:41

節(jié)點(diǎn)鏈表倒數(shù)

2023-04-17 07:33:11

反轉(zhuǎn)鏈表移除鏈表

2012-06-19 14:23:04

云計(jì)算中國(guó)

2021-02-04 08:18:53

LeetCode鏈表

2012-02-17 09:45:04

網(wǎng)速手機(jī)

2012-02-17 09:43:13

手機(jī)網(wǎng)速移動(dòng)互聯(lián)

2012-08-10 10:53:03

云計(jì)算BSA商業(yè)軟件聯(lián)盟

2010-11-15 10:49:23

求職

2012-06-18 10:07:17

云計(jì)算實(shí)力榜

2021-08-26 10:07:25

數(shù)組前端元素

2022-03-07 11:03:08

大數(shù)據(jù)檢測(cè)谷歌

2021-04-12 15:47:00

數(shù)據(jù)結(jié)構(gòu)算法鏈表

2014-11-10 09:29:13

Google

2018-03-01 13:32:28

宏碁游戲本PC行業(yè)

2021-09-22 22:57:41

手機(jī)流量通信

2011-08-08 10:53:55

寶德PR2510N云計(jì)算
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)