Created
October 18, 2019 06:56
-
-
Save forkercat/79de8750d3052303172cdf43cb4a51af to your computer and use it in GitHub Desktop.
not correct~
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Solution { | |
class ListNode { | |
int val; | |
ListNode oldNode = null; // point to old max node | |
ListNode prev = null; | |
ListNode next = null; | |
ListNode(int _val) { val = _val; } | |
} | |
ListNode dummy = new ListNode(0); | |
ListNode dummyTail = new ListNode(0); | |
ListNode maxNode = new ListNode(Integer.MIN_VALUE); | |
MaxStack() { | |
dummy.next = dummyTail; | |
} | |
// helper | |
private ListNode addFirst(int x, ListNode oldMax) { | |
ListNode newNode = new ListNode(x); | |
newNode.oldNode = oldMax; | |
newNode.next = dummy.next; | |
newNode.next.prev = newNode; // if no dummyTail, get NullPointerException | |
newNode.prev = dummy; | |
dummy.next = newNode; | |
return newNode; | |
} | |
private ListNode removeFirst() { | |
ListNode removed = dummy.next; | |
dummy.next = removed.next; | |
dummy.next.prev = dummy; | |
removed.prev = removed.next = null; | |
return removed; | |
} | |
public void push(int x) { | |
if (x >= maxNode.val) { | |
// push the old maxNode | |
addFirst(maxNode.val, maxNode); | |
maxNode = addFirst(x, null); | |
} else { | |
addFirst(x, null); | |
} | |
} | |
public int pop() { | |
ListNode x = removeFirst(); | |
if (x.val == maxNode.val) { // restore | |
ListNode backupNode = removeFirst(); | |
maxNode = backupNode.oldNode; | |
backupNode.oldNode = null; | |
} | |
return x.val; | |
} | |
public int top() { | |
return dummy.next.val; | |
} | |
public int peekMax() { | |
return maxNode.val; | |
} | |
public int popMax() { | |
int max = maxNode.val; | |
// prevNode -> maxNode -> backupNode -> nextNode | |
// prevNode -> nextNode | |
ListNode prevNode = maxNode.prev; | |
ListNode backupNode = maxNode.next; | |
ListNode nextNode = maxNode.next.next; | |
prevNode.next = nextNode; | |
nextNode.prev = prevNode; | |
// clear & update maxNode | |
backupNode.prev = backupNode.next = null; | |
maxNode.prev = maxNode.next = null; | |
maxNode = backupNode.oldNode; | |
backupNode.oldNode = null; | |
return max; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment