题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
解题思路
本题我们需要借助两个指针来帮助我们完成题目,首先创建一个新的头节点head,并让head指向原来链表的头节点,目的是为了防止出现链表第一个节点就出现重复的情况。随后,需要创建两个指针pre和last,pre指针的作用就是记录当前没有出现重复的节点,而last指针则负责寻找下一个不重复出现的节点。当last寻找到时,pre指向last指针的下一个节点(pre=last.next)即可完成删除重复节点的操作。紧接着last指针移位。
图示
last寻找到下一个不重复出现的元素‘5’时,指针定位在‘3’,随后pre=last.next,完成删除重复元素的操作。pre=pre.next 、last=last.next。
代码实现
去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片
.
class ListNode{ //定义链表节点
ListNode next;
int val;
public ListNode(ListNode listNode,int val){
this.val=val;
this.next=listNode;
}
public ListNode(){}
}
public class deleteDuplicateNode {
//删除链表中重复的节点
public ListNode deleteNode(ListNode pHead){
if (pHead==null||pHead.next==null){
return pHead;
}
ListNode head=new ListNode(null,0);//创建一个新的头节点,防止链表第一个元素出现重复
head.next=pHead;
ListNode pre=head;//pre永远指向上一个非重复的元素
ListNode last=head.next;//last去寻找下一个非重复元素
while (last!=null){
if (last.next!=null&&last.val==last.next.val){//出现重复元素时
while (last.next!=null&&last.val==last.next.val){
last=last.next;
}
pre.next=last.next;//链表跳过重复元素
last=last.next;//last继续后移
}else{//没有出现重复时
pre=pre.next;//
last=last.next;//两个指针依次后移
}
}
return head.next;
}
public static void main(String[] args) {
ListNode node1=new ListNode();
ListNode node2=new ListNode();
ListNode node3=new ListNode();
ListNode node4=new ListNode();
ListNode node5=new ListNode();
node1.val=1; node1.next=node2; //头节点
node2.val=2; node2.next=node3;
node3.val=2; node3.next=node4;
node4.val=4; node4.next=node5;
node5.val=6; node5.next=null;
deleteDuplicateNode delete=new deleteDuplicateNode();
ListNode node = delete.deleteNode(node1);
System.out.println(node);
}
}
总结
本题来源于面试经典教材《剑指offer》中 归属于链表类型题目。
同许多在算法道路上不断前行的人一样,不断练习,修炼自己!
如有博客中存在的疑问或者建议,可以在下方留言一起交流,感谢各位!
最后,感谢Jerry算法!