题目:
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
分析:
递归思路,如果当前结点和它的next结点的val值不同,则当前结点可以直接接到已处理完的结点后,继续删除重复的过程;如果当前结点和它的next结点的val值相同,则需要继续遍历,直到找到一个与当前结点val不同的结点作为新链表的头结点,如果找不到,说明链表所有结点元素都一样,新链表为NULL,否则从新的头结点出发,继续删除重复的过程。
非递归思路,新建一个虚拟头结点,若当前结点和它的next结点的val值不同,意味着不是重复结点,可以加入到已处理完的结点后,若相同,需要找到一个与当前结点不同的结点,再重新判断。注意遍历结束后要把最后的当前结点加入到处理完结点之后。
程序:
C++
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == nullptr || pHead->next == nullptr) return pHead; if(pHead->val != pHead->next->val){ pHead->next = deleteDuplication(pHead->next); return pHead; } else{ ListNode* p = pHead; while(p != nullptr && p->val == pHead->val) p = p->next; return deleteDuplication(p); } } };
class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == nullptr || pHead->next == nullptr) return pHead; ListNode* dummyHead = new ListNode(0); ListNode* p = dummyHead; ListNode* curr = pHead; while(curr != nullptr && curr->next != nullptr){ if(curr->val != curr->next->val){ p->next = curr; p = p->next; } else{ while(curr->next != nullptr && curr->val == curr->next->val) curr = curr->next; } curr = curr->next; } p->next = curr; return dummyHead->next; } };
Java
public class Solution { public ListNode deleteDuplication(ListNode pHead) { if(pHead == null || pHead.next == null) return pHead; if(pHead.val != pHead.next.val){ pHead.next = deleteDuplication(pHead.next); return pHead; } else{ ListNode p = pHead; while(p != null && p.val == pHead.val) p = p.next; return deleteDuplication(p); } } }
原文地址:https://www.cnblogs.com/silentteller/p/12110217.html
时间: 2024-10-10 12:34:23