在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
这一题的难点在于:
- 重复的节点一个都不保留,这意味检查该节点是否为重复节点,需要保留其父亲节点。
- 如果重复节点出现在头部,那么需要单独处理
- 如果重复节点出现在尾部,那么尾部指针需要设置为null
其实对于修改链表节点指针问题,例如列表的逆序,我们需要注意的也是这几点。
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null) return null;
ListNode root = null;
ListNode end = null;
// 双指针遍历
ListNode p1 = pHead; //
ListNode p2 = pHead.next; //
while(true){
// 遇到了重复节点,p2 指向下一个节点
if(p2 != null && p2.val == p1.val) {
p2 = p2.next;
}else{// p1 和 p2 不同值
// p1 和 p2 是连续节点
if(p1.next == p2){
if(root == null) {
root = p1; // 初始化根节点
end = root;
}else{
end.next = p1; // 设置end节点
end = p1;
}
}
if(p2 == null) break; // 遍历结束
p1 = p2;
p2 = p2.next;
}
}
if(end != null) end.next = null; // 记得设置end节点的next指针
return root;
}
网友评论