203.逆置链表
想到了双指针,但是在我的认知里面这应该算三指针了吧。
注意链表开头和结尾的特殊情况。
标解的代码好简洁QWQ,注意这里指针的后移不是->next,而是直接将一个指针赋值给另一个指针。
方法二:递归
其关键在于反向工作。假设链表的其余部分已经被反转,现在应该如何反转它前面的部分?
需要注意的是 n1的下一个节点必须指向 ∅。如果忽略了这一点,链表中可能会产生环。
方法三:换值?
83. 删除重复元素
20.有效的括号
注意考虑输入的多个特殊情况,如:
"[", "]" 要进行栈的判空。
bool isValid(string s) {
stack<char>ch;
for(char c:s){
if(c=='('||c=='['||c=='{'){
ch.push(c);
}else {
if(ch.empty())return false;
if(c==')'){
if(ch.top()=='('){
ch.pop();
}else return false;
}else if(c==']'){
if(ch.top()=='['){
ch.pop();
}else return false;
}else if(c=='}'){
if(ch.top()=='{'){
ch.pop();
}else return false;
}
}
}
if(ch.empty())
{
return true;
}else{
return false;
}
}
232.用栈实现队列
class MyQueue {
public:
MyQueue() {
}
stack<int>s1,s2;
void push(int x) {
while (!s2.empty()) {
s1.push(s2.top());
s2.pop();
}
s1.push(x);
}
//自己没有想出来的地方,连续push 之后,pop再push导致出栈的顺序问题。把s2里面的数再导过来到s1,再加入要push的数。
int pop() {
while(!s1.empty()){
s2.push(s1.top());
s1.pop();
}
int e=s2.top();
s2.pop();
return e;
}
int peek() {
while(!s1.empty()){
s2.push(s1.top());
s1.pop();
}
int e=s2.top();
return e;
}
bool empty() {
bool t =s2.empty();
bool t1=s1.empty();
if(t&&t1){
return true;
}else{
return false;
}
}
};