剑指offer-删除链表中重复的结点
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef 来源:牛客网 if (pHead==null || pHead.next==null){return pHead;} ListNode Head = new ListNode(0); Head.next = pHead; ListNode pre = Head; ListNode last = Head.next; 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; }else{ pre = pre.next; last = last.next; } } return Head.next;
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef 来源:牛客网 public static ListNode deleteDuplication(ListNode pHead) { ListNode first = new ListNode(-1);//设置一个trick first.next = pHead; ListNode p = pHead; ListNode last = first; while (p != null && p.next != null) { if (p.val == p.next.val) { int val = p.val; while (p!= null&&p.val == val) p = p.next; last.next = p; } else { last = p; p = p.next; } } return first.next; }
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef 来源:牛客网 public class Solution { public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) { // 只有0个或1个结点,则返回 return pHead; } if (pHead.val == pHead.next.val) { // 当前结点是重复结点 ListNode pNode = pHead.next; while (pNode != null && pNode.val == pHead.val) { // 跳过值与当前结点相同的全部结点,找到第一个与当前结点不同的结点 pNode = pNode.next; } return deleteDuplication(pNode); // 从第一个与当前结点不同的结点开始递归 } else { // 当前结点不是重复结点 pHead.next = deleteDuplication(pHead.next); // 保留当前结点,从下一个结点开始递归 return pHead; } } }
/*
作者:牛客396545268号
链接:https://www.nowcoder.com/questionTerminal/fc533c45b73a41b0b44ccba763f866ef
来源:牛客网
pHead.next = deleteDuplication(pHead.next); 实参pHead.next表示将当前节点与下一节点不同,
所以要将下一节点放入递归程序去参加下一轮的比较,这样就将pHead保留了下来。
返回值给pHead.next表示deleteDuplication返回了一个无重复的节点,所以要让当前节点指向它。
*/