递归算法
算法描述:
`ListNode* deleteDuplication(ListNode* head)`
这个函数的作用是将以head为头结点的链表中的重复元素删除,并返回新链表的头结点
那么按照递归的思想:
如果当前传入的head指针本身就是null(空链表),或者head->next是null(只有一个元素的链表),那就不存在重复的问题,直接返回head作为新链表的头指针即可
如果head->next不是null,那么判断一下head->next结点的值是否等于head结点的值。
如果相等,那么说明出现了重复结点,需要进一步操作。下面细说。
首先需要判断head->next->next是否存在。
如果head->next->nex不存在:说明这两个重复结点后面已经没有其他的节点了,删掉它们后整个链表就是空链表,所以直接return nullptr;
如果head->next->next存在:说明这两个重复结点后还不是终点。
那么接下来要判断这两个重复结点之后的结点是否仍然与它们重复。
如果不重复的话,那直接不管这两个重复的结点,递归计算以head->next->next为头结点的符合要求的新链表并返回即可。
如果这俩重复结点后面的结点还和他们是重复的,那后移一位,递归计算以head->next为头结点的符合要求的新链表并返回。
如果不等,那就说明head与head->next不重复,那么head仍然是新链表的头结点。
随后应用递归,将head->next作为下一次接受检查链表的头指针,删除其中的重复元素,并将新得到的链表接在head的后面。
随后返回head即可
C++ 代码
class Solution {
public:
ListNode* deleteDuplication(ListNode* head) {
if(head==nullptr||head->next==nullptr)
return head;
if(head->val==head->next->val){
if(head->next->next==nullptr)return nullptr;
if(head->next->next->val!=head->next->val)
return deleteDuplication(head->next->next);
else
return deleteDuplication(head->next);
}
else {
head->next=deleteDuplication(head->next);
return head;
}
}
};