题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。
在网上参考了各种做法,最终总结到以下两种,递归与非递归:
总体思路:找到下一个不重复的节点与其相连。
代码
链表类的定义:
class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
递归做法:
public static ListNode deleteDuplication(ListNode pHead){//递归做法
if(pHead == null || pHead.next == null){//递归出口
return pHead;
}
ListNode pCurr ;
if(pHead.val == pHead.next.val){//出现重复节点
pCurr = pHead.next.next;
while(pCurr != null && pCurr.val == pHead.val){//若后续的节点有val且val与pHead相等,则pCurr一直往后移(相当于删除操作),直到pCurr为null或者val不等。
pCurr = pCurr.next;
}
return deleteDuplication(pCurr);//以pCurr作为新的头结点继续调用。
}
else{//无重复节点
pCurr = pHead.next;
pHead.next = deleteDuplication(pCurr);//把头结点与去重后剩余的节点再连起来。
return pHead;//返回头结点
}
}
非递归做法:
public static ListNode deleteDuplication1(ListNode pHead){//非递归做法
if(pHead == null)
return null;
ListNode cur = pHead;//cur节点用于判断后面是否含有重复元素。
ListNode newHead = new ListNode(pHead.val-1);//新创一个newHead头结点,跟原链表相连,用于避免头结点就是重复值的情况。pHead-1是为了避免newHead的val跟头结点一样。
newHead.next = cur;
ListNode pre = newHead;//pre节点用于记录cur节点的上一个节点。
while(cur != null && cur.next != null){
if(cur.val == cur.next.val){//出现重复节点
int val = cur.val;
cur = cur.next.next;
while(cur != null && cur.val == val){
cur = cur.next;
}
pre.next = cur;//若头结点就是重复值,则pre.next就是新的头结点。
}
else{//无重复节点
pre = cur;
cur = cur.next;
}
}
return newHead.next;
}
以上仅为个人学习笔记,若有需改正的地方请指正!