删除按升序排列的单链表中的重复元素

删除链表中的重复元素

题目

存在一个按升序排列的链表,给你这个链表的头节点 head,请你删除所有重复的元素,使每个元素 只出现一次 。然后返回同样按升序排列的结果链表。如下示例所示:
在这里插入图片描述
输入:head = [1,1,2]
输出:[1,2]

解决思路

命令指针p指向链表的头节点,然后判断p的下一个节点的值和p节点的值是否相等,若相等,则删除p的下一个节点,如果不相等,则将p向下移动一位,然后继续判断。

代码

  • C++代码
# include <stdio.h>

struct ListNode {
    int val;
    ListNode *next;
    ListNode(): val(0), next(nullptr) {}
    ListNode(int val): val(val), next(nullptr) {}
    ListNode(ListNode *next): val(0), next(next) {}
    ListNode(int val, ListNode *next): val(val), next(next) {}
};


class Solution {
public:
    ListNode *deleteDuplicates(ListNode* head) {
        if (nullptr == head) {
            return head;
        }

        ListNode *p = head;
        while (p->next) {
            if (p->val == p->next->val) {    	// 判断p节点的值和p节点的下一个节点的值是否相等
                p->next = p->next->next;
            } else {
                p = p->next;    				// 若p节点的值和p的下一个节点的值不相等,将p向下移动一位
            }
        }
        return head;
    }
};


int main() {
    ListNode *a = new ListNode(1);
    ListNode *b = new ListNode(1);
    ListNode *c = new ListNode(2);
    ListNode *head = a;

    a->next = b;
    b->next = c;

    printf("before delete: ");
    while (head) {
        printf("%d ", head->val);
        head = head->next;
    }
    printf("\n");

    head = a;
    Solution *solution = new Solution();
    ListNode *ret = solution->deleteDuplicates(head);
    printf("after delete: ");
    while (ret) {
        printf("%d ", ret->val);
        ret = ret->next;
    }

    return 0;
}
  • python代码
# -*- coding: utf-8 -*-

class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next


class Solution:
    def deleteDuplicates(self, head: ListNode) -> ListNode:
        if not head:
            return head

        p: ListNode = head
        while p.next:
            if p.val == p.next.val:				# 判断p节点的值和p节点的下一个节点的值是否相等
                p.next = p.next.next
            else:								# 若p节点的值和p的下一个节点的值不相等,将p向下移动一位
                p = p.next

        return head


def main():
    a: ListNode = ListNode(1)
    b: ListNode = ListNode(1)
    c: ListNode = ListNode(2)
    head: ListNode = a

    a.next = b
    b.next = c

    print("before delete: ", end='')
    while head:
        print(head.val, end=' ')
        head = head.next
    print()

    head = a
    solution: Solution = Solution()
    ret: ListNode = solution.deleteDuplicates(head)
    print("after delete: ", end='')
    while ret:
        print(ret.val, end=' ')
        ret = ret.next

    return


if __name__ == "__main__":
    main()

说明

  • 对应LeetCode第83题。
  • 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值