剑指offer系列——56.删除链表中重复的结点

Q:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
A:题目并不难,重要的是,可以在head前添加一个头结点,防止head被删的情况。

   ListNode *deleteDuplication(ListNode *pHead) {
        if (pHead == nullptr || pHead->next == nullptr)
            return pHead;
        ListNode *node = new ListNode(0);
        node->next = pHead;
        pHead = node;
        ListNode *temp = pHead;
        while (node->next != nullptr) {
            if (node->val == node->next->val) {
                while (temp->next != node)
                    temp = temp->next;
                while (node->next != nullptr && node->val == node->next->val)
                    node = node->next;
                temp->next = node->next;
                node->next = nullptr;
                node = temp->next;
            } else {
                node = node->next;
            }
        }
        return pHead->next;
    }

Q:给出一个排好序的链表,删除链表中的所有重复出现的元素,只保留原链表中只出现一次的元素。
例如:
给出的链表为1->2->3->3->4->4->5, 返回1->2->5.
给出的链表为1->1->1->2->3, 返回2->3.
A:

public static ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null)
            return head;
        ListNode newHead = new ListNode(Integer.MIN_VALUE);
        newHead.next = head;
        ListNode cur = head;
        ListNode last = newHead;
        while (cur != null && cur.next != null) {
            if (cur.val != cur.next.val) {
                last = cur;
            } else {
                while (cur.next != null && cur.val == cur.next.val)
                    cur = cur.next;
                last.next = cur.next;
            }
            cur = cur.next;
        }
        return newHead.next;
    }
posted @ 2020-02-26 15:53  Shaw_喆宇  阅读(127)  评论(0编辑  收藏  举报