题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
采用单指针的方法,用一个当前指针cur表示当前节点的所在,判断cur.next和cur.next.next的值是否相等,如果相等则计算有多少个相同的节点,并跳过这些节点;再次从cur出发判断cur.next和cur.next.next的值是否相等,判断当前节点后面接上来的节点是否是相同的。确认后面接上的节点不是相同的之后,移动cur,指向下一节点。
注意:执行循环的条件是cur.next!=null && cur.next.next!=null,因为在循环里面后判断了当前节点往后两个节点的情况,所以这里不用担心链表最后的两个节点没有得到处理。
代码(Java):
public class doingmyself {
public static void main(String[] args) {
int[] arr = {1,2,3,3,4,4,5};
List<ListNode> list = new ArrayList<ListNode>();
for(int i = 0;i<arr.length;i++) {
ListNode node = new ListNode(arr[i]);
list.add(node);
}
for(int i = 0;i<list.size()-1;i++) {
list.get(i).next = list.get(i+1);
}
ListNode head = list.get(0);
ListNode ans = deleteDuplicates(head);
System.out.println();//用于调试
}
public static ListNode deleteDuplicates(ListNode head) {
ListNode dummy = new ListNode(0);//为了预防删除头结点的情况
dummy.next = head;
ListNode cur = dummy; //cur表示当前节点的位置
while(cur.next!=null && cur.next.next!=null) {//如果当前节点不是最后两个节点时执行循环,在里面判断当前节点后面两个节点是否重复,所以不用担心最后两个节点没有判断
if(cur.next.val == cur.next.next.val) { //如果当前节点的后面两个节点的值相等,则判断需要跳过多少个节点
ListNode temp = cur.next; //temp先表示重复节点的第一个
while(temp!=null && temp.next!=null && temp.val==temp.next.val) { //只要遇到重复的不断往后移
temp = temp.next;
}
cur.next = temp.next;//当前节点直接指向不重复之后第一个节点
}else {
cur = cur.next;//如果当前节点后面两个节点不是重复的,则当前节点往后移
}
}
return dummy.next;
}
}
class ListNode{
int val;
ListNode next;
ListNode(int x){
val = x;
}
}