写在前面
本题与下面这道题目极其相似,读者可对比阅读,加深印象
题目博客连接
学习目标:
目标:熟练运用Java所学知识
学习内容:
本文内容:使用Java实现:删除排序链表中的重复元素Ⅱ
题目描述:
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字。
示例 1:
输入: 1->2->3->3->4->4->5
输出: 1->2->5
示例 2:
输入: 1->1->1->2->3
输出: 2->3
解题思路
- 首先创建新的链表(带傀儡),用于存放返回结果
ListNode newHead=new ListNode(0);//创建带傀儡的新链表
ListNode newTail=newHead;//记录链表的尾结点
- 通过循环,逐个的判断当前结点的val是否与下一个结点的相同
while(cur!=null){
//判断当前结点与下一个结点是否相同
if(cur.next!=null&&cur.val==cur.next.val){
//当下一个结点与当前结点相同时,跳过当前结点,直到下一个节点与当前结点不相同
while(cur!=null&&cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
}else{
//将只出现一次的结点放入新链表
newTail.next=new ListNode(cur.val);
newTail=newTail.next;
}
cur=cur.next;//因为这个题目要求不保留重复元素,所以需要加上这条语句
}
实现代码
public static ListNode deleteDuplicates(ListNode head) {
ListNode cur=head;
ListNode newHead=new ListNode(0);//创建带傀儡的新链表
ListNode newTail=newHead;//记录链表的尾结点
while(cur!=null){
//判断当前结点与下一个结点是否相同
if(cur.next!=null&&cur.val==cur.next.val){
//当下一个结点与当前结点相同时,跳过当前结点,直到下一个节点与当前结点不相同
while(cur!=null&&cur.next!=null&&cur.val==cur.next.val){
cur=cur.next;
}
cur=cur.next;//因为这个题目要求不保留重复元素,所以需要加上这条语句
}else{
//将只出现一次的结点放入新链表
newTail.next=new ListNode(cur.val);
newTail=newTail.next;
cur=cur.next;
}
}
return newHead.next;//返回新链表,因为带傀儡,所以从第二个节点返回
}