112. 删除排序链表中的重复元素(remove-duplicates-from-sorted-list)(c++)----lintcode面试题之链表

本文介绍两种方法实现删除已排序链表中的重复元素,确保每个元素仅出现一次。方法一通过比较前后节点值来删除重复项,方法二通过跳过连续重复节点简化链表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(一)题目要求:

给定一个排序链表,删除所有重复的元素每个元素只留下一个。

(二)示例:

给出 1->1->2->null,返回 1->2->null

给出 1->1->2->3->3->null,返回 1->2->3->null

(三)题解:

注意分析题设,给定的是已排序好的链表,复杂度降低;否则是否考虑用map??

方法一:

**
 * Definition of ListNode
 * class ListNode {
 * public:
 *     int val;
 *     ListNode *next;
 *     ListNode(int val) {
 *         this->val = val;
 *         this->next = NULL;
 *     }
 * }
 */

//方法一:
//p_prev :删除结点的前结点  p_current : 当前结点
//遍历链表,如果值等于比较值,则删除该结点,更新当前结点指针
//如果值不等于比较值,则说明是新的值,更新比较值,前结点和当前结点指针后移

class Solution {
public:
    /*
     * @param head: head is the head of the linked list
     * @return: head of linked list
     */
    ListNode * deleteDuplicates(ListNode * head) {
        // write your code here
       if(!head)
         return NULL;
         
       ListNode *p_prev = head,*p_current = head->next;
       int val_cmp = head->val;
       
       while(p_current)
       {
          if(p_current->val == val_cmp)
          {
              p_prev->next = p_current->next;
              delete p_current;
              p_current = p_prev->next;
          }
          else
          {
             val_cmp = p_current->val;
             p_prev = p_current;
             p_current = p_current->next;
          }
       }
       
       return head;
    }
};

方法二:

//方法二:
//比较当前结点和当前结点的下一个结点,相等则当前结点指向下一个结点的下一个结点
//不等则当前结点指针后移
//(注意没有释放结点内存空间,否则需引入 tmp 指针保存删除结点的指针值)
class Solution{
public:
    /**
     * @param head: The first node of linked list.
     * @return: head node
     */
    ListNode *deleteDuplicates(ListNode *head) {
        if (head == NULL) {
            return NULL;
        }

        ListNode *node = head;
        while (node->next != NULL) {
            if (node->val == node->next->val) {
                node->next = node->next->next;
            } else {
                node = node->next;
            }
        }
        return head;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值