剑指offer:删除链表中重复的节点

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

# Definition for singly-linked list.
class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

class Solution:
    def deleteDuplication(self, head):
        """
        给定一个有序的链表,删除所有重复的节点
        """
        # 我们先设置一个辅助节点
        # begin用来定位在返回链表的头节点的前一个节点(辅助节点)上
        # pre_node用来定位返回链表的尾节点
        begin = pre_node = ListNode(0)
        while head:
            c = 0  # 当前值出现的次数,初始化为0可以使后续代码更简洁
            val = head.val  # 当前值
            # 记录当前节点,因为无论如何,head都会往前移动一次,当下面这个while退出之后,
            # cur != head
            cur = head
            # 当前值连续出现的次数
            while head and head.val == val:
                c += 1
                head = head.next
            # 如果当前值只连续出现过1次,说明不是重复节点,需要将当前节点添加到链表的末尾
            # 由于pre_node是定位尾节点的,所以每次添加一个尾节点的时候,需要将原尾节点(pre_node)
            # 和新的尾节点连接起来,然后将pre_node重新定位到链表的尾节点
            if c == 1:
                pre_node.next = cur
                pre_node = pre_node.next

        # 当遍历完整个链表之后,注意要将尾节点与Null连接起来
        pre_node.next = None
        # begin在头节点的前一个节点(辅助节点)上,因此返回begin.next
        return begin.next

原文地址:https://blog.51cto.com/jayce1111/2382980

时间: 2024-10-10 12:34:19

剑指offer:删除链表中重复的节点的相关文章

剑指Offer——删除链表中重复的结点

题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 分析: 因为已经排好序了,所以如果相邻的数值一样的话,那么就跳过该数值,不过要记录前一结点的指针,将其next指向后一个没有重复的结点. 代码: 1 /* 2 struct ListNode { 3 int val; 4 struct ListNode *next; 5 Li

剑指offer-18-2. 删除链表中重复的结点

剑指offer-18-2. 删除链表中重复的结点 链表 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 思路: 采用递归的方法查找从头节点开始重复的节点 如果没有重复节点,pHead.next指向deleteDuplication(pHead.next)返回的pHead.next本身 如果有重复节点则pHead.next指向pHead

剑指Offer-56.删除链表中重复的结点(C++/Java)

题目: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 分析: 递归思路,如果当前结点和它的next结点的val值不同,则当前结点可以直接接到已处理完的结点后,继续删除重复的过程:如果当前结点和它的next结点的val值相同,则需要继续遍历,直到找到一个与当前结点val不同的结点作为新链表的头结点,如果找不到,说明链表所有结点元素都一

剑指offer-删除链表中重复的节点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路 定义preNode指向当前结点pNode的前一个节点,每次访问pNode时首先判断它与后面节点是否重复,若重复则置bool型变量needDel为true.不需要删除时preNode和pNode分别指向下一个节点:需要删除时,首先保存pNode指向的结点值,依次向后遍历

剑指offer57 删除链表中重复的结点

class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(!pHead) return pHead; struct ListNode *pre=(struct ListNode *)malloc(sizeof(struct ListNode)); pre->next=pHead; ListNode *p1=pre; ListNode *p2=pre->next; while(p2&&p2

剑指Offer(链表)-删除链表中重复的节点

(删除链表中重复的节点)题目描述: 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解题思路:这里的重复的节点不保留是将只要重复了的节点都要删除掉,所以考虑利用哈希set的方法,先进行重复性的判断,将重复的元素加入到哈希set中去,然后将重复的元素删除. 利用到了两个指针pre和cur,来表示前一个节点和当前节点. /* public

剑指offer——面试题18.1:删除链表中重复的节点

1 // 面试题18(二):删除链表中重复的结点 2 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 3 // 结点被删除之后,链表如图3.4(b)所示. 4 5 #include <cstdio> 6 #include "List.h" 7 8 void DeleteDuplication(ListNode** pHead) 9 { 10 if(pHead == nullptr || *pHead == nullptr) 11 retur

删除链表中重复的节点

因为这个程序快累死老子了,细节处理很麻烦package Solutions; import java.util.ArrayList; /** * Created by hu on 2015/12/12. *//** 删除链表中重复的结点*在一个排序的链表中,存在重复的结点,* 请删除该链表中重复的结点,重复的结点不保留,返回链表头指针.* 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5** */public class solut

刷题--删除链表中重复的节点

题目描述: 在一个排序的链表中,存在重复的节点,请删除该链表中重复的节点,重复的节点不保留,返回链表头指针.例如,,链表1->2->3->3->4->4->5 处理后为 1->2->5 [解1]使用HashMap记录每个节点是否重复出现,时间复杂度为O(N),空间复杂度为O(N) 1 import java.util.*; 2 3 /* 4 public class ListNode { 5 int val; 6 ListNode next = null;