📌  相关文章
📜  用于从排序的链表中删除重复项的 C# 程序(1)

📅  最后修改于: 2023-12-03 15:40:53.150000             🧑  作者: Mango

用于从排序的链表中删除重复项的 C# 程序

这是一个用于从排序的链表中删除重复项的 C# 程序。该程序接受一个整数链表作为输入,并返回一个删除重复项后的链表。

代码实现

下面是该程序的代码实现。该程序通过遍历链表,并将不重复的节点依次放入新链表中来达到删除重复项的目的。

public class ListNode {
    public int val;
    public ListNode next;
    public ListNode(int val = 0, ListNode next = null) {
        this.val = val;
        this.next = next;
    }
}

public class Solution {
    public ListNode DeleteDuplicates(ListNode head) {
        if (head == null) {
            return null;
        }

        ListNode dummy = new ListNode(-1);
        ListNode cur = head;
        ListNode tail = dummy;

        while (cur != null) {
            if (cur.next == null || cur.next.val != cur.val) {
                tail.next = cur;
                tail = cur;
                cur = cur.next;
            } else {
                int val = cur.val;
                while (cur != null && cur.val == val) {
                    cur = cur.next;
                }
            }
        }

        tail.next = null;
        return dummy.next;
    }
}
代码解析

该程序定义了两个类,一个是链表节点 ListNode,一个是解决问题的类 Solution

Solution 类中,定义了一个公共方法 DeleteDuplicates,它接受一个链表头节点 head,并返回一个删除重复节点后的链表。

程序使用三个指针,dummy 指针,tail 指针和 cur 指针,来操作链表。其中,dummy 指针指向一个虚拟的头节点,tail 指针始终指向新链表的尾节点,而 cur 指针则用于遍历原链表。

程序使用 while 循环来遍历链表,并判断当前节点是否和下一个节点重复。如果不重复,则将该节点放入新链表尾部,并更新 tail 指针和 cur 指针。如果重复,则使用一个内部循环来找到最后一个重复节点,并跳过这些重复节点。

最后,程序将 tail 指针的 next 指向 null,并返回新链表的头节点。

总结

该程序通过简单的指针操作和链表遍历,实现了从排序的链表中删除重复项的功能。程序中使用了虚拟头节点和三个指针来避免讨论头节点和尾节点特殊情况的问题,同时还考虑了原链表为空的情况,使得程序更加健壮和实用。