算法 单链表删除重复元素

1.删除重复的元素,保留一个
leetcode题目
代码:

/**
 * 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 newHead = head;
        while(head.next != null){
     
            if(head.val == head.next.val){
     
            	//遇到相等,跳过下一节点,当前结点next指向下下节点
                head.next = head.next.next;
            }else{
     
                head = head.next;
            }
        }
        return newHead;
    }
}

2.删除重复元素,全部保留
leetcode题目
思路:遇到这种单链表的删除题目,并且全部删除的话,基本可以采用增加一个哨兵节点.next指向当前头结点,可以避免会把头结点也删除掉,同时再增加一个辅助指针即可
代码:

/**
 * 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 preHead = new ListNode(0);
        preHead.next = head;
        ListNode l1 = preHead;
        while(l1.next != null && l1.next.next != null){
     
            if(l1.next.val == l1.next.next.val){
     
                ListNode temp = l1.next;
                while(temp != null && temp.next != null && temp.val == temp.next.val){
     
                    temp = temp.next;
                }
                //temp会指向重复元素的最后一个
                l1.next = temp.next;
            }else{
     
                l1 = l1.next;
            }
        }
        return preHead.next;
    }
}

你可能感兴趣的:(算法,算法,单链表)