如何通過一次遍歷刪除鏈表倒數(shù)第N個(gè)元素
給定一個(gè)鏈表,刪除鏈表的倒數(shù)第n個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。本篇經(jīng)驗(yàn)將分享一個(gè)快慢指針?biāo)惴ǎ贠(1)的空間復(fù)雜度下返回結(jié)果。聲明鏈表節(jié)點(diǎn)類首先,我們需要聲明一個(gè)鏈表節(jié)點(diǎn)類,用于構(gòu)建鏈表結(jié)構(gòu)。```
給定一個(gè)鏈表,刪除鏈表的倒數(shù)第n個(gè)節(jié)點(diǎn),并且返回鏈表的頭結(jié)點(diǎn)。本篇經(jīng)驗(yàn)將分享一個(gè)快慢指針?biāo)惴?,在O(1)的空間復(fù)雜度下返回結(jié)果。
聲明鏈表節(jié)點(diǎn)類
首先,我們需要聲明一個(gè)鏈表節(jié)點(diǎn)類,用于構(gòu)建鏈表結(jié)構(gòu)。
```java
public class ListNode {
int val;
ListNode next;
ListNode(int x) { val x; }
}
```
通過快慢指針找到倒數(shù)第n個(gè)元素
我們可以通過兩個(gè)間隔為n的節(jié)點(diǎn)指針,找到倒數(shù)第n個(gè)元素。
首先,初始化兩個(gè)指針,分別指向鏈表的頭部。然后,將快指針向前移動(dòng)n步。接著,快指針和慢指針一起向前移動(dòng),直到快指針遍歷完鏈表。此時(shí),慢指針會(huì)指向倒數(shù)第n個(gè)節(jié)點(diǎn)元素。需要注意的是,如果快指針向前移動(dòng)n步之后已經(jīng)為空,則說明我們要?jiǎng)h除的是第一個(gè)元素。
```java
public ListNode removeNthFromEnd(ListNode head, int n) {
ListNode dummy new ListNode(0);
head;
ListNode fast dummy;
ListNode slow dummy;
// 快指針先向前移動(dòng)n步
for (int i 0; i < n; i ) {
fast ;
}
// 快慢指針一起向前移動(dòng),直到快指針遍歷完鏈表
while (fast ! null) {
fast ;
slow ;
}
// 刪除倒數(shù)第n個(gè)節(jié)點(diǎn)
;
return ;
}
```
輸出鏈表
為了驗(yàn)證算法的正確性,我們可以編寫代碼輸出整個(gè)鏈表。
```java
public void printList(ListNode head) {
ListNode curNode head;
while (curNode ! null) {
( " ");
curNode ;
}
();
}
```
測(cè)試代碼
在主方法中,我們可以構(gòu)建一個(gè)鏈表并調(diào)用上述方法刪除倒數(shù)第n個(gè)元素,并將結(jié)果輸出到控制臺(tái)。
```java
public static void main(String[] args) {
Solution solution new Solution();
ListNode head new ListNode(1);
ListNode node2 new ListNode(2);
ListNode node3 new ListNode(3);
ListNode node4 new ListNode(4);
ListNode node5 new ListNode(5);
node2;
node3;
node4;
node5;
int n 2;
ListNode result (head, n);
(result);
}
```
運(yùn)行結(jié)果
運(yùn)行主方法,觀察控制臺(tái)輸出,可以驗(yàn)證算法的正確性。
```
1 2 3 5
```
提交算法
最后,我們可以將算法提交到面試平臺(tái)進(jìn)行測(cè)試。