题目:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5 输出: 1->2->5
示例 2:
输入: 1->1->1->2->3 输出: 2->3
思路:参考原文链接:https://blog.csdn.net/qunxingvip/article/details/51892388
以下代码基本的思路是记录相同的节点的个数,一个相同的保存,多个相同的跳过。
代码:
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
public class Solution {
public static ListNode deleteDuplicates(ListNode head) {
ListNode newHead = new ListNode(0);//记录原始头结点的前一个节点,以便最后返回结果
if(head ==null || head.next ==null)
return head;
ListNode cur = newHead; //记录当前头结点的前一个节点
while(head!=null){
ListNode p = head;
int count = 0;
// 记录相同结点的个数
while(p!=null && p.val == head.val){
p = p.next; count++;
}
if(count==1){
// 1 说明就一个
cur.next = head;//头结点和前一个节点分别向前推进
cur = cur.next;
head = head.next;
}
else
head = p;//头结点跳过重复的节点,头结点的前一个节点不变
}
cur.next =null;//最后要在整个节点后添加空节点
// 断开后面的结点
return newHead.next; //注意返回的是什么
}
}
执行最快的代码:
在以下代码中使用了递归的思路删除相同元素。这种递推的思路很简单。需要注意最后结束的条件。
class Solution {
public ListNode deleteDuplicates(ListNode head) {
if(head==null || head.next==null)
return head;
if(head.val==head.next.val){
ListNode node=head.next;
while(node!=null&& node.val==head.val){
node=node.next;
}
return deleteDuplicates(node);
}
else{
head.next=deleteDuplicates(head.next);
return head;
}
}
}