0
点赞
收藏
分享

微信扫一扫

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

删除链表中的重复元素

题目

存在一个按升序排列的链表,给你这个链表的头节点 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;
}

说明

  • 对应LeetCode第83题。
  • 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list/
举报

相关推荐

0 条评论