题解 | #删除有序链表中重复的元素-II#
删除有序链表中重复的元素-II
http://www.nowcoder.com/practice/71cef9f8b5564579bf7ed93fbe0b2024
思路:
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;
}
}