首次提交成功,未优化

使用队列,元素先进,查看链表元素与队尾元素是否相同,相同时不入队,且在遇到下一个不同元素时删除队尾元素(要注意链表传入时的指向问题,要将队尾节点指向设为null)

import java.util.*;

/*
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
      // 列表为空
      if (head == null) {
        return null;
      }
      // 队列
      LinkedList<ListNode> queue = new LinkedList<ListNode>();
      // 创建当前节点,后面循环判断
      ListNode curNode = head;
      int count = 1;
      while (curNode != null) {
        // 队列为空,直接加入元素
        if (queue.isEmpty()) {
          queue.add(curNode);
          curNode = curNode.next;
          continue;
        }
        ListNode node = queue.peekLast();
        // 如果当前节点值与列表最后一个值相同,则不入队,且进行记录,这里用计数方法,否则入队
        if (node.val == curNode.val) {
          count ++;
          curNode = curNode.next;
          
        } else {
          if (count > 1) {
            queue.pollLast();
            count = 1;
          }
          queue.add(curNode);
          curNode = curNode.next;
        }
      }
      // 列表结尾相同的情况
      if (count > 1) {
        queue.pollLast();
      }
      // 队列为空,说明列表中的元素都有值相同情况  
      if (queue.isEmpty()) {
        return null;
      }
      // 去除队列最后元素的指向
      queue.peekLast().next = null;
      // 队头作为返回的列表头节点
      ListNode res = queue.poll();
      if (queue.isEmpty()) {
        res.next = null;
      }
      ListNode node = res;
      // 队列中没有重复的元素构成列表
      while (!queue.isEmpty()) {
        node.next = queue.poll();
        node = node.next;
      }
      return res;
    }
}