mirror of
https://github.com/Snailclimb/JavaGuide
synced 2025-06-25 02:27:10 +08:00
修改和完善部分内容
This commit is contained in:
parent
6d156a72c5
commit
3481546300
@ -164,7 +164,9 @@ public class Solution {
|
|||||||
|
|
||||||
### 问题分析
|
### 问题分析
|
||||||
|
|
||||||
首先两个节点/指针,一个节点 node1 先开始跑,指针 node1 跑到 k-1 个节点后,另一个节点 node2 开始跑,当 node1 跑到最后时,node2 所指的节点就是倒数第k个节点。
|
> **链表中倒数第k个节点也就是正数第(L-K+1)个节点,知道了只一点,这一题基本就没问题!**
|
||||||
|
|
||||||
|
首先两个节点/指针,一个节点 node1 先开始跑,指针 node1 跑到 k-1 个节点后,另一个节点 node2 开始跑,当 node1 跑到最后时,node2 所指的节点就是倒数第k个节点也就是正数第(L-K+1)个节点。
|
||||||
|
|
||||||
|
|
||||||
### Solution
|
### Solution
|
||||||
@ -199,23 +201,24 @@ public class Solution {
|
|||||||
while (node1 != null) {
|
while (node1 != null) {
|
||||||
node1 = node1.next;
|
node1 = node1.next;
|
||||||
count++;
|
count++;
|
||||||
if(k<1){
|
if (k < 1 && node1 != null) {
|
||||||
node2 = node2.next;
|
node2 = node2.next;
|
||||||
}
|
}
|
||||||
k--;
|
k--;
|
||||||
}
|
}
|
||||||
// 如果节点个数小于所求的倒数第k个节点,则返回空
|
// 如果节点个数小于所求的倒数第k个节点,则返回空
|
||||||
if(count<index) return null;
|
if (count < index)
|
||||||
|
return null;
|
||||||
return node2;
|
return node2;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
# 4. 删除链表的倒数第N个节点
|
# 4. 删除链表的倒数第N个节点
|
||||||
|
|
||||||
|
|
||||||
> Leetcode:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
|
> Leetcode:给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
|
||||||
|
|
||||||
**示例:**
|
**示例:**
|
||||||
@ -239,7 +242,8 @@ public class Solution {
|
|||||||
|
|
||||||
### 问题分析
|
### 问题分析
|
||||||
|
|
||||||
我们注意到这个问题可以容易地简化成另一个问题:删除从列表开头数起的第 (L - n + 1)个结点,其中 LL 是列表的长度。只要我们找到列表的长度 L,这个问题就很容易解决。
|
|
||||||
|
我们注意到这个问题可以容易地简化成另一个问题:删除从列表开头数起的第 (L - n + 1)个结点,其中 L是列表的长度。只要我们找到列表的长度 L,这个问题就很容易解决。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
@ -247,7 +251,7 @@ public class Solution {
|
|||||||
|
|
||||||
**两次遍历法**
|
**两次遍历法**
|
||||||
|
|
||||||
首先我们将添加一个 **哑结点** 作为辅助,该结点位于列表头部。哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部。在第一次遍历中,我们找出列表的长度 L。然后设置一个指向哑结点的指针,并移动它遍历列表,直至它到达第 (L - n) 个结点那里。我们把第 (L - n)个结点的 next 指针重新链接至第 (L - n + 2)个结点,完成这个算法。
|
首先我们将添加一个 **哑结点** 作为辅助,该结点位于列表头部。哑结点用来简化某些极端情况,例如列表中只含有一个结点,或需要删除列表的头部。在第一次遍历中,我们找出列表的长度 L。然后设置一个指向哑结点的指针,并移动它遍历列表,直至它到达第 (L - n) 个结点那里。**我们把第 (L - n)个结点的 next 指针重新链接至第 (L - n + 2)个结点,完成这个算法。**
|
||||||
|
|
||||||
```java
|
```java
|
||||||
/**
|
/**
|
||||||
@ -286,16 +290,18 @@ public class Solution {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
复杂度分析:
|
**复杂度分析:**
|
||||||
|
|
||||||
- 时间复杂度 O(L) :该算法对列表进行了两次遍历,首先计算了列表的长度 LL 其次找到第 (L - n)(L−n) 个结点。 操作执行了 2L-n2L−n 步,时间复杂度为 O(L)O(L)。
|
- **时间复杂度 O(L)** :该算法对列表进行了两次遍历,首先计算了列表的长度 LL 其次找到第 (L - n)(L−n) 个结点。 操作执行了 2L-n2L−n 步,时间复杂度为 O(L)O(L)。
|
||||||
|
- **空间复杂度 O(1)** :我们只用了常量级的额外空间。
|
||||||
- 空间复杂度 O(1) :我们只用了常量级的额外空间。
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
**进阶——一次遍历法:**
|
**进阶——一次遍历法:**
|
||||||
|
|
||||||
|
|
||||||
|
> **链表中倒数第N个节点也就是正数第(L-N+1)个节点。
|
||||||
|
|
||||||
其实这种方法就和我们上面第四题找“链表中倒数第k个节点”所用的思想是一样的。**基本思路就是:** 定义两个节点 node1、node2;node1 节点先跑,node1节点 跑到第 n+1 个节点的时候,node2 节点开始跑.当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点(L代表总链表长度,也就是倒数第 n+1 个节点)
|
其实这种方法就和我们上面第四题找“链表中倒数第k个节点”所用的思想是一样的。**基本思路就是:** 定义两个节点 node1、node2;node1 节点先跑,node1节点 跑到第 n+1 个节点的时候,node2 节点开始跑.当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点(L代表总链表长度,也就是倒数第 n+1 个节点)
|
||||||
|
|
||||||
```java
|
```java
|
||||||
@ -315,11 +321,11 @@ public class Solution {
|
|||||||
// 声明两个指向头结点的节点
|
// 声明两个指向头结点的节点
|
||||||
ListNode node1 = dummy, node2 = dummy;
|
ListNode node1 = dummy, node2 = dummy;
|
||||||
|
|
||||||
// node1 节点先跑,node1节点 跑到第 n+1 个节点的时候,node2 节点开始跑
|
// node1 节点先跑,node1节点 跑到第 n 个节点的时候,node2 节点开始跑
|
||||||
//当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点(L代表总链表长度,也就是倒数第 n+1 个节点)
|
// 当node1 节点跑到最后一个节点时,node2 节点所在的位置就是第 (L-n ) 个节点,也就是倒数第 n+1(L代表总链表长度)
|
||||||
while (node1 != null) {
|
while (node1 != null) {
|
||||||
node1 = node1.next;
|
node1 = node1.next;
|
||||||
if (n < 0) {
|
if (n < 1 && node1 != null) {
|
||||||
node2 = node2.next;
|
node2 = node2.next;
|
||||||
}
|
}
|
||||||
n--;
|
n--;
|
||||||
@ -389,4 +395,3 @@ public ListNode Merge(ListNode list1,ListNode list2) {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user