链表 删除单链表的重复节点

力扣链接

  • 题目描述
    编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。
    示例1: 输入:[1, 2, 3, 3, 2, 1]
    输出:[1, 2, 3]
    示例2: 输入:[1, 1, 1, 1, 2]
    输出:[1, 2]
  • 提示: 链表长度在[0, 20000]范围内。 链表元素在[0, 20000]范围内。
  • 进阶:
    如果不得使用临时缓冲区,该怎么解决?
  • 解题思路
  • 思路一:定义两个指针current和p来逐个遍历链表,current元素依次和p比较,直到p为NULL,current向后移动一个。
  • 代码实现
c 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
/*
函数主要是两层循环,外层循环实现遍历整个链表,内层循环负责遍历比较当前节点值与其后所有节点值,若相等则跳过,
*/
struct ListNode* removeDuplicateNodes(struct ListNode* head) {
    // Return NULL if the list is empty
    if (head == NULL) return NULL;
    
    struct ListNode *current = head;

    // Iterate through each node in the list
    while (current) {
        struct ListNode* p = current;
        // Check subsequent nodes for duplicates
        while (p->next) {
            // If a duplicate is found, remove it
            if (p->next->val == current->val) {
                p->next = p->next->next;
            } else {
                // Otherwise, move to the next node
                p = p->next;
            }
        }
        // Move to the next node in the list
        current = current->next;
    }
    
    // Return the modified list
    return head;
}
  • 问题记录
  1. 内层循环的结果是在哪保存的?
    内层循环遍历current节点后的所有节点,发现有重复值时,就会改变节点的指向,即已经改变了链表结构。下一次遍历时,链表已经是改变后的链表了。
  • 思路二:利用标记数组,标记当前值是否出现过。
c 复制代码
struct ListNode* removeDuplicateNodes(struct ListNode* head){
       if(head == NULL || head->next == NULL) return NULL;

       int index[20001] = {0};
       index[head->val] = 1;

        struct ListNode *pre = head, *q = head->next;
       while(q){
            if(index[q->val] == 0){
                index[q->val] = 1;
                pre = q;
                q = q->next;
            }else{
                pre->next = q->next;
                q = pre->next;
            }
       }
       return head;
}
相关推荐
奔跑吧 android3 小时前
【linux kernel 常用数据结构和设计模式】【数据结构 2】【通过一个案例属性list、hlist、rbtree、xarray数据结构使用】
linux·数据结构·list·kernel·rbtree·hlist·xarray
默默无名的大学生5 小时前
数据结构—顺序表
数据结构·windows
Jared_devin5 小时前
二叉树算法题—— [蓝桥杯 2019 省 AB] 完全二叉树的权值
数据结构·c++·算法·职场和发展·蓝桥杯
siy23336 小时前
[c语言日记] 数组的一种死法和两种用法
c语言·开发语言·笔记·学习·链表
AI 嗯啦7 小时前
数据结构深度解析:二叉树的基本原理
数据结构·算法
hai_qin7 小时前
十三,数据结构-树
数据结构·c++
和光同尘@7 小时前
66. 加一 (编程基础0到1)(Leetcode)
数据结构·人工智能·算法·leetcode·职场和发展
我爱996!9 小时前
LinkedList与链表
数据结构·链表
yb0os19 小时前
RPC实战和核心原理学习(一)----基础
java·开发语言·网络·数据结构·学习·计算机·rpc
hope_wisdom10 小时前
C/C++数据结构之栈基础
c语言·数据结构·c++··stack