今天开始讲和大家坚持打卡面试非常重要算法练习---剑指offer,希望我们能一起肝。
1 题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
2 思路1----python
将所有节点得值放到一个列表中,再筛选出值数量为1得值----python
3 思路2----c++
需要删除重复节点,我们需要保留一个待删除节点之前得节点,代码中使用pre表示
使用一个指针指向当前遍历得节点
当头节点与后续节点相等时需额外处理
4 代码实现
c++版本
//author xiaolan
class Solution {
public:
ListNode* deleteDuplication(ListNode* pHead)
{
if (pHead == NULL)
return NULL;
ListNode *pre = NULL;
ListNode *p = pHead;
int flag = 0; //判断是否出现重复节点,当flag==1时,当前节点出现重复
while (p)
{
while (p->next && p->val == p->next->val) //如果节点重复,一直遍历下去
{
flag = 1;
p = p->next;
}
if (flag == 0) //如果当前节点不重复,遍历下一个节点
{
pre = p;
p = p->next;
}
else //如果当前节点重复,分类处理
{
flag = 0;
if (pre == NULL) //如果从头结点开始出现重复,重置头结点指针
{
pHead = p->next;
p = pHead;
}
else //否则,跳过重复的节点
{
pre->next = p->next;
p = pre->next;
}
}
}
return pHead;
}
};
java版本
public class Solution {
public ListNode deleteDuplication(ListNode head){
ListNode first=new ListNode(-1);//新建一个头节点,避免,从head就开始重复
first.next=head;
ListNode current=head;
ListNode start=first; //保存重复节点的前一个节点
while(current!=null&¤t.next!=null){
if(current.val==current.next.val){
int value=current.val;
while(current!=null&¤t.val==value){
current=current.next;
}
start.next=current;
}else{
start=current;
current=current.next;
}
}
//注意要返回first.next,避免从head就开始重复,而head被删除
return first.next;
}
}
python版本
#author xiaolan
class Solution:
def deleteDuplication(self, pHead):
res = []
# 所有元素入列表
while pHead:
res.append(pHead.val)
pHead = pHead.next
res = list(filter(lambda c: res.count(c) == 1, res))
dummy = ListNode(0)
pre = dummy
for i in res:
node = ListNode(i)
pre.next = node
pre = pre.next
return dummy.next
5 唠嗑
2020年7月23日打卡,打卡格式"打卡XX天"。暖蓝汇聚大家一起,探讨简历修改,面试经历分享,尽全力让大家能在2020找到理想的工作。如果你想加入,加我拉你进面试交流群。