题目
题号:56
题目名:删除链表中重复的结点
编程语言
Java
题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。
例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
初次思路
一个简单的链表结点删除问题
一般删除一个结点,都需要找到被删除的结点的前置结点
为了方便,定义一个虚拟头结点
删除结点只需要找到新结点的位置,将前置结点的指针指向新的位置,这样中间那一段都会被删除
如果该节点与后面结点的值相等,那就创建一个指针继续往后找,找到不相等的结点,然后做删除操作
如果不相等,直接将前置结点和遍历结点后移即可
解题代码
public class Solution {
public ListNode deleteDuplication(ListNode pHead) {
if(pHead==null||pHead.next==null) return pHead;
ListNode dummy = new ListNode(0);//虚拟头结点
dummy.next = pHead;
ListNode pre = dummy;//设置一个遍历前置结点
ListNode curr = pHead;//设置一个遍历结点
while(curr!=null&&curr.next!=null) {
//如果遍历到的当前节点等于下一个结点的值,那么开始找到和这个结点值相等的结点的后一个不相等的结点
if(curr.val==curr.next.val) {
ListNode innerCurr = curr.next;
while(innerCurr.val==curr.val) {
innerCurr = innerCurr.next;
if(innerCurr==null) break;//如果到了末尾直接跳出循环
}
curr=innerCurr;//curr指向值不为选中值的后一个结点
pre.next = innerCurr;//前置指针后继连向该结点,切断那些相等值的结点
}else {
//如果不相等,直接后移指针继续遍历
pre=pre.next;
curr = curr.next;
}
}
return dummy.next;
}
}
算法练习代码我都开源在码云上,有需要的朋友可以看看