删除链表中重复的节点(Java实现)

xiaoxiao2021-02-28  70

本题为剑指offer面试题58

牛客网测试地址:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef

[编程题]删除链表中重复的结点 热度指数:63742  时间限制:1秒  空间限制:32768K 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

Java代码:

package go.jacob.day607; import go.jacob.day609.Demo5.ListNode; public class Demo2 { // 递归实现 public ListNode deleteDuplication_1(ListNode pHead) { // 递归停止条件 if (pHead == null || pHead.next == null) return pHead; ListNode current = pHead.next; // 如果pHead是重复元素 if (pHead.val == current.val) { current = current.next; while (current != null && current.val == pHead.val) current = current.next; pHead = current; return deleteDuplication_1(current); } else { // pHead不是重复元素 pHead.next = deleteDuplication_1(current); return pHead; } } //方法二:循环实现 public ListNode deleteDuplication_2(ListNode pHead) { if (pHead == null || pHead.next == null) return pHead; ListNode preNode = null; ListNode node = pHead; ListNode postNode = null; boolean needDel = false; while (node != null) { // 如果node不是最后一个节点 if (node.next != null) { postNode = node.next; //postNode为null或者val与node.val不同的第一个节点 while (postNode != null && postNode.val == node.val) { postNode = postNode.next; needDel = true; } } else //到链表结尾 postNode = null; // 如果node和postNode不同,即不需要进行删除操作 if (!needDel) { //如果第一个元素为空 if (preNode == null) { preNode = node; pHead = preNode; } else { preNode.next = node; preNode = node; } node = postNode; } else { node = postNode; needDel = false; if (postNode == null && preNode != null) preNode.next = null; } } return preNode == null ? null : pHead; } //方法三:循环实现:剑指offer解法 public ListNode deleteDuplication_3(ListNode pHead) { if(pHead==null||pHead.next==null) return pHead; ListNode pPreNode=null; ListNode pNode=pHead; while(pNode!=null){ ListNode pNext=pNode.next; boolean needDelete=false; if(pNext!=null&&pNext.val==pNode.val) needDelete=true; if(!needDelete){ pPreNode=pNode; pNode=pNode.next; }else{ int value=pNode.val; ListNode pToBeDel=pNode; while(pToBeDel!=null&&pToBeDel.val==value){ pNext=pToBeDel.next; pToBeDel=pNext; } if(pPreNode==null) pHead=pNext; else pPreNode.next=pNext; pNode=pNext; } } return pHead; } class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } }

转载请注明原文地址: https://www.6miu.com/read-35377.html

最新回复(0)