坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day14
删除链表中的节点
- 题目描述
- 解题思路
- 删除指定节点(只知道Node,不知道Node上一个节点的情况下)
- 将该节点(node)的后一个节点的值copy到node,然后删除下一个节点即可
- 代码参考
go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteNode(node *ListNode) {
node.Val = node.Next.Val
node.Next = node.Next.Next
}
删除链表的倒数第N个结点
- 题目描述
- 解题思路
- 法一:
- 需要创建dummy node,因为当n为链表长度的时候,会删除掉头节点
- 先遍历得到数组长度,然后就知道是正数第几个位置了
- 这时再遍历到目标节点的上一个节点的位置,就可以实现删除了
- (妙啊)法二:
- 左右指针
- 先让right指针走n步
- 再left、right指针一起走,让right指针走到链表的最后一个节点
- 此时,left指针的下一个节点即为要删除的倒数第n个节点!
- 左右指针
- 法一:
- 代码参考
go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func removeNthFromEnd(head *ListNode, n int) *ListNode {
dummy := &ListNode{Next:head}
left := dummy
right := dummy
for ;n>0;n--{
right = right.Next
}
for right.Next != nil{
right = right.Next
left = left.Next
}
//注意,是左指针的下一个节点为倒数第n个节点
left.Next = left.Next.Next
return dummy.Next
}
- tips
-注意,是左指针的下一个节点为倒数第n个节点
删除排序链表中的重复元素
- 题目描述
- 解题思路
- 遍历链表,值相同就把后面重复的节点删除
- 代码参考
go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteDuplicates(head *ListNode) *ListNode {
if head == nil{
return nil
}
cur := head
for cur.Next != nil {
if cur.Val == cur.Next.Val{
cur.Next = cur.Next.Next
}else{
cur = cur.Next
}
}
return head
}
- tips
- 注意:cur.Next可以为空,但是cur不能为空,否则cur.Next就报错了!
- 所以要写if else,不能只写 if
- 注意排除头节点head为nil的情况(链表长度可能为0)
- 注意:cur.Next可以为空,但是cur不能为空,否则cur.Next就报错了!
删除排序链表中的重复元素2
- 题目描述
- 解题思路
- if中套循环
- 代码参考
go
/**
* Definition for singly-linked list.
* type ListNode struct {
* Val int
* Next *ListNode
* }
*/
func deleteDuplicates(head *ListNode) *ListNode {
dummy := &ListNode{Next:head}
cur := dummy
for cur.Next != nil && cur.Next.Next != nil{
value := cur.Next.Val
if value == cur.Next.Next.Val{
for cur.Next != nil && cur.Next.Val == value{
cur.Next = cur.Next.Next
}
}else{
cur = cur.Next
}
}
return dummy.Next
}