在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead == null || pHead.next == null)
return pHead;
ListNode head = new ListNode(0); //head 用来记录结果链表
//主要定义三个指针,分别指向当前节点,前一个节点,后一个节点,遇到重复节点时,对前一个和后一个节点进行挂链操作
ListNode pre = head;
ListNode pnode = pHead;
head.next = pnode;
while (pnode != null) {
ListNode pnext = pnode.next;
boolean isDelete = false;
if (pnext != null && pnode.val == pnext.val) {
isDelete = true;
}
if (!isDelete) { //节点不重复,指针继续前跑
pre = pnode;
pnode = pnode.next;
} else { //遇到重复节点
//当找个有一个重复节点时,继续往后查找是否还有相同值的节点,直到没有,才进行删除节点操作
while (pnext != null && pnext.val == pnode.val) {
pnext = pnext.next;
}
if (pre == null) {
pHead = pnext;
} else {
pre.next = pnext;
}
pnode = pnext;
}
}
return head.next;
}
}