美文网首页
18-删除链表节点、删除链表重复节点

18-删除链表节点、删除链表重复节点

作者: 一方乌鸦 | 来源:发表于2020-05-05 22:00 被阅读0次

1. 删除链表节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if (head.val == val) {
            if (head.next == null) return null;
            head = head.next;
            return head;
        }
        ListNode tmp = head;
        while(tmp.next != null) {
            if (tmp.next.val == val) {
                tmp.next = tmp.next.next;
                return head;
            } else {
                tmp = tmp.next;
            }
        }
        return head;
    }
}

2. 删除链表中的重复节点

给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。

示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5

示例 2:
输入: 1->1->1->2->3
输出: 2->3

解法 1. 递归:相当于从后往前删,记录一个repeatNum ,只要当前的值等于repeatNum ,返回next

class Solution {
    private int repeatNum = Integer.MAX_VALUE;

    public ListNode deleteDuplicates(ListNode head) {
        if(head == null || head.next == null)  return head;
        // 1. 递归中获取正确的 next
        head.next = deleteDuplicates(head.next);
        // 2. head 值等于 next , 标记 repeatNum
        if(head != null && head.next != null && head.val == head.next.val){
            repeatNum = head.val;
        }
        // 3. head 值为 repeatNum 一律跳过
        while(head != null && head.val == repeatNum){
            head = head.next;
        }

        return head;
    }
}

解法 2. 非递归:使用快慢节点,慢节点作为哨兵节点处理头节点,快节点处理重复节点

class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null) return head;
        ListNode dummy = new ListNode(Integer.MIN_VALUE);
        dummy.next = head;
        ListNode slow = dummy;
        ListNode fast = dummy.next;
        while (fast != null) {
            while (fast.next != null && fast.val == fast.next.val) fast = fast.next;
            if (slow.next == fast) {
              // 无重复
              slow = slow.next;
            } else {
              // 有重复,将最后一个重复节点也去除
              slow.next = fast.next;
            }
            fast = fast.next;
        }
        return dummy.next; 
    }
}

相关文章

  • 18-删除链表节点、删除链表重复节点

    1. 删除链表节点 2. 删除链表中的重复节点 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没...

  • 删除链表中重复的节点

    删除链表中重复的节点在一个排序的链表中,如何删除重复的节点?

  • Leetcode总结 -- 链表

    目录 链表的基本操作 改/遍历:while(?) 查: 返回倒数K个节点 增/删除:反转链表,删除链表中的重复节点...

  • Day 2 删除无序链表中的重复节点

    算法 Day2 删除无序链表中的重复节点,保留一个 给定一个无序单向链表的头节点,删除内部的重复节点,使其内部节点...

  • 链表-链表节点的删除

    场景 1 链表无序,有重复节点,删除链表中值为data的节点。思路:链表的删除分为“头删”和“中间尾删” 头删:头...

  • 2019-02-19

    java删除链表中重复的节点(保留一个节点)

  • 单向链表算法

    单向链表 反转单向链表 单链表查找倒数第k个节点 单链表递归倒序打印 单链表排序 单链表删除重复节点

  • 数据结构与算法之链表面试题(四)

    目录 删除链表中的节点反转一个链表递归实现迭代(非递归)实现 一 删除链表中的节点 237. 删除链表中的节点 说...

  • 删除链表中重复的节点

    《剑指offer》面试题18:题目二:删除链表中重复的节点。 题目:在一个排序的链表中,如何删除重复的节点?例如,...

  • 链表-链表删除

    链表删除注意点 链表作为函数出口返回 删除首节点 删除中间节点注意保护 代码实现

网友评论

      本文标题:18-删除链表节点、删除链表重复节点

      本文链接:https://www.haomeiwen.com/subject/edikghtx.html