[leetCode]删除排序链表中的重复元素 II

解法一 指针

preNode指向当前指针的前一个节点;curNode指向当前节点;nextNode指向当前节点后的一个节点(不重复)。

  1. 以curNode不为null为条件,向后遍历:判断curNode与nextNode指向的节点值是否相同
    - 不相同:按顺序往后移动这三个指针
    - 相同:说明有重复元素,向后移动nextNode指针直到跳过所有相同节点,然后删除相同的节点。
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null) return null;
        ListNode preNode = null;//当前指针的前一个指针
        ListNode curNode = head;//当前指针
        while(curNode != null){
            ListNode nextNode = curNode.next;
            boolean isNeedToBeDel =  false;
            if(nextNode != null && curNode.val == nextNode.val){
                isNeedToBeDel = true;
            }
            if(!isNeedToBeDel){
                preNode = curNode;
                curNode = nextNode;
            }else{
                //移动指针直到出现不相同的节点或者空节点
                while(nextNode != null && nextNode.val == curNode.val){
                    nextNode = nextNode.next;
                }
                if(preNode == null){//preNode为null说明头节点为重复节点
                    head = nextNode;
                    curNode = nextNode;
                }else{
                    preNode.next = nextNode;
                    curNode = nextNode;
                }
            }   
        }
        return head;
    }
}

双指针 + 递归

链表的每个节点可以看作是一个新的链表,此问题可以转化为删除链表头部相同的节点:

  1. 如果头节点为null则返回null
  2. curHead指向头节点,nextNode指向之后的节点,如果两个指针指向的节点值相同则使用nextNode指针跳过相同的节点,递归删除下一条链表
  3. 如果该链表头节点不重复,则递归删除下一个节点所在的链表
class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if(head == null) return null;
        ListNode curHead = head;
        ListNode nextNode = curHead.next;
        if(nextNode!=null && curHead.val == nextNode.val){
            while(nextNode != null && nextNode.val == curHead.val){
                nextNode = nextNode.next;
            }
            return deleteDuplicates(nextNode);
        }
        head.next = deleteDuplicates(head.next);
        return head;
    }
}
posted @ 2020-08-14 10:11  消灭猕猴桃  阅读(68)  评论(0编辑  收藏  举报