单链表找重复

Charliexiu Lv2

解题思路

单链表,遍历每一个元素,相同就把这个元素删除然后继续往后

- 采用一个新的指针指向头指针 head 然后向后遍历链表,删除相同元素,不相同就继续遍历

- 这样方便直接顺序输出结果

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/**

 * Definition for singly-linked list.

 * type ListNode struct {

 *     Val int

 *     Next *ListNode

 * }

 */

type ListNode struct {

    Val  int

    Next *ListNode

}

func deleteDuplicates(head *ListNode) *ListNode {

    if head == nil || head.Next == nil {

        return head

    }

    curr := head

    for curr != nil && curr.Next != nil {

        if curr.Val == curr.Next.Val {

            curr.Next = curr.Next.Next

        } else {

            curr = curr.Next

        }

    }

    return head

}

需要一个打印

1
2
3
4
5
6
7
8
9
10
11
12
13
func printList(head *ListNode) {

    for head != nil {

        fmt.Print(head.Val, " ")

        head = head.Next

    }

    fmt.Println()

}

执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
fun main {

    head := &ListNode{Val: 1, Next: &ListNode{Val: 1, Next: &ListNode{Val: 2, Next: &ListNode{Val: 3, Next: &ListNode{Val: 3}}}}}

    fmt.Println("Original List:")

    printList(head)



    // delete duplicates and print the result

    newHead := deleteDuplicates(head)

    fmt.Println("List with Duplicates Removed:")

    printList(newHead)

}

对代码做出解释

 type ListNode struct  结构体定义了两个变量,第二个变量是一个自身结构体类型的指针

 在 deleteDuplicates 函数中,执行 curr.Next = curr.Next.Next 时,相当于将 curr 指针所指向的节点的 Next 指针指向了当前节点的下下个节点,这个操作修改了链表的结构,即将当前节点的下一个节点删除了。因为 head 存储的是链表头节点的地址,而不是链表节点的值或指针,所以当你修改链表结构时,链表的头节点的地址并没有发生改变,但链表的内容已经发生了改变。

 这里可以这么理解,传进来的head就是 头指针,curr被赋值为head ,同样指向了链表的头节点,然后向后遍历,curr是本身,而curr.next就需要通过head.next去找,同理,curr.next.next也是在head找,找到后改变了head的next和next.

image.png{:width=400}

  • 标题: 单链表找重复
  • 作者: Charliexiu
  • 创建于: 2023-04-19 23:30:54
  • 更新于: 2023-04-19 23:34:19
  • 链接: https://ccharlie-xiu.github.io/2023/04/19/单链表/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
此页目录
单链表找重复