add leetcode content

This commit is contained in:
gameloader 2024-03-03 11:08:51 +08:00
parent a5552c4d12
commit 7ff717e4c2

View File

@ -341,3 +341,84 @@ func abs(val int) int {
### 总结 ### 总结
注意一个go的语法问题, 如果在for range循环中两个变量都使用匿名变量, 则应该使用赋值运算符而不是创建并赋值运算符, 即`for _,_ = range slice` 而不是`for _,_ := range slice`. 这很可能是因为匿名变量默认为已经创建好的变量, 不需要再创建匿名变量本身了. 注意一个go的语法问题, 如果在for range循环中两个变量都使用匿名变量, 则应该使用赋值运算符而不是创建并赋值运算符, 即`for _,_ = range slice` 而不是`for _,_ := range slice`. 这很可能是因为匿名变量默认为已经创建好的变量, 不需要再创建匿名变量本身了.
## day6 2024-03-03
### 19. Remove Nth Node From End of List
Given the head of a linked list, remove the nth node from the end of the list and return its head.
![0303SQETJiUaYzaQ](https://testingcf.jsdelivr.net/gh/game-loader/picbase@master/uPic/0303SQETJiUaYzaQ.png)
### 题解
给出了链表头, 要求移除从后到前的第n个节点. 如果想一遍遍历就完成这个任务. 就使用空间换时间, 使用一个数组保存所有的Next指针的值. 然后让倒数第n+1个元素的Next指针指向n个元素的Next指针即可, 注意处理链表只有一个元素的特殊情况.
### 代码
```go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
var ptr []*ListNode
current := head
for current.Next != nil{
ptr = append(ptr, current)
current = current.Next
}
ptr = append(ptr, current)
if(len(ptr) == 1){
return nil
}else if len(ptr) == n{
return ptr[1]
}else{
ptr[len(ptr)-n-1].Next = ptr[len(ptr)-n].Next
return head
}
}
```
### 总结
在题解中看到大部分使用的是快慢指针的解法, 快慢指针应该是本题想要的解法, 下面贴一个快慢指针的解法示例
```go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummyHead := &ListNode{-1, head}
cur, prevOfRemoval := dummyHead, dummyHead
for cur.Next != nil{
// n step delay for prevOfRemoval
if n <= 0 {
prevOfRemoval = prevOfRemoval.Next
}
cur = cur.Next
n -= 1
}
// Remove the N-th node from end of list
nthNode := prevOfRemoval.Next
prevOfRemoval.Next = nthNode.Next
return dummyHead.Next
}
```