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