思路:

1)先定义好两个栈(分别命名为 st 和 stack)、一个指针、一个临时节点以及一个整型变量

2)然后,初始化指针,使其指向头节点;初始化整型变量,使其为 Integer 的最小值

3)将指针从头开始依次遍历(就是很普通的链表遍历)

3.1)如果当前指针指向的节点的值不等于 val,直接将该节点入栈(st),val 值更新为当前节点的值,同时指针向后移动

3.2)如果当前指针指向的节点的值等于 val,那就将栈里存放的与当前 val 值相等的值全部弹出,我们要保证栈里的节点没有重复的 val 值

4)遍历结束后,我们就得到了 st。这时我们要判断 st 是否为空。

4.1)如果 st 为空,直接返回 null

4.2)如果不为空,先将 st 里的节点全部放入到 stack 中,然后再将 stack 中的节点全部弹出(这一步别忘了,不然你最终得到的链表是反过来的)

import java.util.Stack;

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

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @return ListNode类
     */
    public ListNode deleteDuplicates (ListNode head) {
        // write code here
        if (null == head) {
            return null;
        }
        if (null == head.next) {
            return head;
        }
        Stack<ListNode> st = new Stack<>();
        Stack<ListNode> stack = new Stack<>();
        int val = Integer.MIN_VALUE;
        ListNode tmp = null;
        ListNode p = head;
        while (null != p) {
            if (p.val == val) {
                while (!st.isEmpty()) {
                    tmp = st.pop();
                    if (tmp.val != val) {
                        st.push(tmp);
                        break;
                    }
                }
                val = p.val;
                p = p.next;
            }
            else {
                st.push(p);
                val = p.val;
                p = p.next;
            }
        }
        if (st.isEmpty()) {
            return null;
        }
        while (!st.isEmpty()) {
            stack.push(st.pop());
        }
        head = stack.pop();
        p = head;
        while (!stack.isEmpty()) {
            p.next = stack.pop();
            p = p.next;
        }
        p.next = null;
        return head;
    }
}