17 - 01 - 01 单链表-删除重复元素

// 用图 请与作者联系哦~

typedef struct Node
{
    DataType data;
    struct Node *next;
}LNode,LinkList;
  //头指针:LinkList H;

/*删除重复结点*/
void pur_LinkList(LinkList H)
{
    LNode *q, *p, r;
    p = H->next;
    if( p==NULL )
        return ;
    while(p->next)
    {
        q = p;
        while(q->next)
        {
            if(q->next->data == p->data)
            {
                r = q->next;
                q->next = r->next;
                free(r);
            }
            else
                q = q->next;
        }
        p = p->next;
    }
}
T = O(n^2)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用双指针法,一个指针指向当前节点,另一个指针指向当前节点的下一个节点。如果当前节点的值等于下一个节点的值,则将下一个节点删除,否则将当前节点指向下一个节点。重复这个过程直到链表末尾。最后返回头节点即可。 ### 回答2: 在删除元素非递减的单链表中的重复元素这个问题中,我们需要做的是遍历整个链表,并判断当前节点和下一个节点是否值相同。如果值相同,则将当前节点的next指针指向下一个节点的next指针,同时释放下一个节点的内存空间。如果值不同,则继续遍历下一个节点。 具体实现时,我们可以这样做: 1. 遍历整个链表,从头节点开始,判断当前节点和下一个节点是否值相同。 2. 如果值相同,则执行以下步骤: 1)将当前节点的next指针指向下一个节点的next指针。 2)释放下一个节点的内存空间。 3)将当前节点不动,继续判断当前节点的值是否与下一个节点的值相同。 3. 如果值不同,则将当前节点指向下一个节点,继续遍历下一个节点。 4. 遍历直到链表的尾节点,遍历结束。 这样就能够删除元素非递减的单链表中的重复元素了。 需要注意的是,删除节点时需要先将节点的next指针指向下一个节点的next指针,再释放下一个节点的内存空间,否则会出现内存泄漏的问题。同时,在判断节点值是否相同时,应该使用等于号(==)而不是赋值操作(=),否则会改变节点的值。 ### 回答3: 题目描述: 给定一个非递减的单链表,你需要删除重复元素。 例如:链表 1 -> 1 -> 2 -> 3 -> 3,删除后变为 1 -> 2 -> 3。 解题思路: 根据题目要求,我们需要将非递减的单链表中的重复元素删除,由于链表是非递减的,因此如果当前节点的值和下一个节点的值相等,则说明存在重复,我们只需要将下一个节点删除即可。 在处理完一段连续的重复元素后,重新连接链表。 这道题可以使用两种方法解决,第一种是使用递归,第二种是使用迭代。 方法一:递归 使用递归的思想,先判断当前节点和下一个节点的值是否相等,如果相等,就将下一个节点删除,然后继续递归,直到没有重复为止。 方法二:迭代 使用迭代的思想,先设置当前指针为头节点,然后循环遍历链表,判断当前节点和下一个节点的值是否相等,如果相等,则删除下一个节点,将当前指针指向下一个节点,如果不相等,则将当前指针移动到下一个节点。 代码实现: 方法一:递归 public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) { return head; } if (head.val == head.next.val) { head.next = head.next.next; return deleteDuplicates(head); } else { head.next = deleteDuplicates(head.next); return head; } } 方法二:迭代 public ListNode deleteDuplicates(ListNode head) { if (head == null || head.next == null) { return head; } ListNode cur = head; while (cur != null && cur.next != null) { if (cur.val == cur.next.val) { cur.next = cur.next.next; } else { cur = cur.next; } } return head; } 总结: 本题是链表操作的经典题目,多数面试中都会考到,需要掌握递归和迭代两种解题方法,同时还需要注意链表指针的操作,根据不同的操作要求进行指针重定向,才能达到删除重复元素的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值