zoukankan      html  css  js  c++  java
  • 【剑指offer】18.删除链表中重复节点

    思路

    实现

    /*
    说下大概思路:
    与链表的其他题目类似,为了防止删除头结点的极端情况发生,先创建空结点dummy,使dummy指向传入的head结点。
    然后创建cur的指针,指向链表的头部(即dummy)。
    接着对cur指针迭代,因为要对比cur(cur最初始的定义指向空结点)指针的下一个结点与下下一个结点的值是否相等,为了防止产生空指针异常,故退出迭代的条件为:cur.next != null && cur.next.next != null。
    在迭代过程中,如果cur.next.val == cur.next.next.val说明此时有重复元素,此时创建一个临时指针temp,指向cur的下一个节点,即temp指向的第一个重复元素所在的位置。通过while循环去重,去重后,temp指向的是重复元素中的最后一个位置。最后cur.next = temp.next就实现了消除重复元素。
    当然,如果为发现重复元素,则直接向后迭代即可。
    > https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/solution/java-ya-jie-dian-fei-di-gui-rong-yi-li-jie-yong-sh/
    */
    func deleteDuplicates(head *ListNode) *ListNode {
    	if head == nil {
    		return head
    	}
    	// 添加dummy节点,统一head情况的处理. 因为没有dummy节点的话, 那么删除头节点时需要额外处理。
    	dummy := &ListNode{0, head}
    	cur := dummy
    	for cur.Next != nil && cur.Next.Next != nil {
    		// 判断cur的下一个结点与下下一个结点的值是否相等
    		if cur.Next.Val == cur.Next.Next.Val {
    			// 定位最后一个重复元素
    			tmp := cur.Next // tmp初始化指向第一个重复元素
    			for tmp != nil && tmp.Next != nil && tmp.Val == tmp.Next.Val {
    				tmp = tmp.Next
    			} // 循环退出时,tmp指向最后一个重复元素
    			cur.Next = tmp.Next // 去掉tmp指向的最后一个重复元素
    		} else {
    			cur = cur.Next
    		}
    	}
    	return dummy.Next
    }
    

    https://gitee.com/sicnu-yudidi/interview/blob/master/剑指offer-v2/链表/82. Remove Duplicates from Sorted List II/main.go

  • 相关阅读:
    简单的三栏,文字多行居中效果 css原生
    目录
    HttpRunner使用
    测试职能
    缺陷
    SQL操作数据
    jmeter使用
    接口自动化理论引入
    接口自动化框架(Pytest,Allure,Yaml)
    jmeter 登陆--查询存在否-->新建客户-->查询存在否 + 压测
  • 原文地址:https://www.cnblogs.com/yudidi/p/12558417.html
Copyright © 2011-2022 走看看