56.删除链表中重复的结点

题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

【分析】

删除重复结点,分别记录当前结点前最晚访问的不重复结点pPre、当前结点pCur、当前结点后面的结点pNext的三个指针。

如果当前节点和它后面的几个结点数值相同,那么这些结点都要被剔除,然后更新pPre和pCur;如果不相同,则直接更新pPre和pCur。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
        val(x), next(NULL) {
    }
};
*/
class Solution {
public:
    ListNode* deleteDuplication(ListNode* pHead)
    {
        if(pHead==NULL)//鲁棒性
            return NULL;
        ListNode* pPre=NULL;//指向当前结点前最晚访问过的不重复结点
        ListNode* pCur=pHead;//指向当前处理的结点
        ListNode* pNext=NULL;//指向当前结点后面的结点
        while(pCur!=NULL)
        {
            if(pCur->next != NULL && pCur->val == pCur->next->val)// 如果当前结点与下一个结点相同
            {
                /*删除这两个节点*/
                pNext = pCur->next;
            while(pNext->next!=NULL && pNext->next->val==pCur->val)//找到不重复的最后一个结点位置
            {
                pNext = pNext->next;
            }
            // 如果pCur指向链表中第一个元素,pCur -> ... -> pNext ->... 
            // 要删除pCur到pNext, 将指向链表第一个元素的指针pHead指向pNext->next。
            if(pCur == pHead)
            {
                pHead = pNext->next;
            }
            // 如果pCur不指向链表中第一个元素,pPre -> pCur ->...->pNext ->... 
            // 要删除pCur到pNext,即pPre->next = pNext->next
            else
            {
                pPre->next = pNext->next;
            }
            // 向前移动
            pCur = pNext->next;
        }
        // 如果当前结点与下一个结点不相同
        else{
            pPre = pCur;
            pCur = pCur->next;
            }
        }
        return pHead;
    }
};

 

首先,我们来依次实现这些操作: 1. 创建一个单链表,每个节点包含整数值:我们可以定义一个Node类,包含整数value和指向下一个节点的指针next。例如: ```python class Node: def __init__(self, value=0): self.value = value self.next = None # 创建单链表 [3, 6, 4, 7, 4] list_36474 = [Node(i) for i in [3, 6, 4, 7, 4]] ``` 2. 在第三个位置插入数据为1:我们需要找到第3个节点,然后在其之后添加新节点。 ```python new_node = Node(1) current = list_36474[2] # 第三个节点 current.next = new_node ``` 现在链表变为 [3, 6, 1, 4, 7, 4] 3. 删除第一个结点:简单地将第二个节点赋给头节点即可。 ```python if len(list_36474) > 1: # 防止空链表异常 list_36474 = list_36474[1:] ``` 链表变为 [6, 1, 4, 7, 4] 4. 查找并输出第4个结点上的值:直接访问列表的第四个元素。 ```python fourth_node_value = list_36474[3].value if len(list_36474) >= 4 else None print("第四个节点的值:", fourth_node_value) ``` 5. 查找数据为4的结点并输出其位置:遍历链表直到找到值为4的节点。 ```python position = -1 for index, node in enumerate(list_36474): if node.value == 4: position = index break print("值为4的结点位置:", position) ``` 6. 输出链表的长度:通过遍历计算节点数量。 ```python list_length = len(list_36474) print("链表长度:", list_length) ``` 7. 打印链表:按照顺序输出所有节点的值。 ```python for node in list_36474: print(node.value, end=" -> ") ``` 注意:以上代码假设Python环境,并且需要对节点进行适当的初始化才能运行。如果要在其他语言如C++、Java等实现,语法会有所不同。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值