题解 | #删除有序链表中重复的元素-II#
删除有序链表中重复的元素-II
https://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024
方法:不断判断当前节点与其之后的节点的值是否相同
- 相同:标记当前节点为重复节点,同时next指向下一个节点
- 不同:进一步判断当前节点之前是否为重复节点,如果是则要将其pre指向其next,如果不是则正常后移
public class Solution {
/**
*
* @param head ListNode类
* @return ListNode类
*/
public ListNode deleteDuplicates (ListNode head) {
// write code here
//思路:分为三部分,第一部分重复,中间重复,第三部分重复
//快慢指针法
if(head==null||head.next==null)return head;
boolean repeat=false;
ListNode cur=head;
int curval=cur.val;
ListNode newHead=new ListNode(-9999);
ListNode pre=newHead;
while(cur.next!=null){
//如果后继节点值==当前节点值
//标记当前节点为重复节点,后继节点后移
if(cur.val==cur.next.val){
repeat=true;
cur.next=cur.next.next;
}else{
//如果后继结点值!=当前节点值
//但是当前节点之前发生了重复
//那么当前节点不能保留
if(repeat){
repeat=false;
pre.next=cur.next;
cur=cur.next;
//如果当前节点之前未发生重复
//那么当前节点是可以保留的
}else{
pre.next=cur;
pre=cur;
cur=cur.next;
}
}
}
//最后再判断一次最后一个节点是否也是重复节点需要删除
if(repeat){
repeat=false;
pre.next=cur.next;
cur=cur.next;
}
return newHead.next;
}
}
海康威视公司福利 1364人发布