1.【Remove Nth Node From End of List】(Easy)
移走链表倒数第n个节点并返回表头,如
1->2->3->4->5,n
=
2,返回1->2->3->5
解题思路:一个指针指向表头,一个指针p遍历链表直到null,一个指针q与p距离n一起遍历,这样p到头的时候,q指向倒数第n个节点的前一个节点,如果是移除头结点则直接返回头结点的下一个节点。
Accept代码:
public class Solution {
public ListNode
removeNthFromEnd(ListNode head, int n) {
if(head == null) return head;
ListNode p = head,q = head;
int i = 0;//计数器
while(q != null){
if(i
> n) p = p.next; //距离为n的时候再开始后移
i++; q =
q.next;
}
if(i < n) return head;//n超范围
if(i == n) return head.next;//移除第一个节点
p.next = p.next.next;//移除非头节点
return head;
}
}
优化思路:在头结点前加一个节点dummy,这样方便移除头结点,将一个指针指到第n个节点,然后另一个指针再从dummy一起后移直到前面的指针到头,移除该指针后面的节点,返回dummy后面的节点
优化代码:
public class Solution {
public ListNode
removeNthFromEnd(ListNode head, int n) {
if (n <= 0) {return null;}
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode preDelete = dummy;
for (int i = 0; i < n; i++) {
if (head
== null) {return
null;}
head =
head.next;
}
while (head != null) {
head =
head.next;
preDelete
= preDelete.next;
}
preDelete.next = preDelete.next.next;
return dummy.next;
}
}
2.【Valid
Parentheses】(Easy)
一个字符串只包含'(',')','{','}','['和']',括号必须是对应的,如"()"和"()[]{}"正确,但"(]"和"([)]"错误。
解题思路:用栈类,将字符一一入栈,如果为空或不配对直接入,如果字符与栈顶字符配对则栈顶字符出栈,直到遍历过所有字符,此时如果栈为空则true否则为false,当字符串为空时为true,为单字符时为false。
Accept代码:
public class Solution {
public boolean
isValid(String s) {
if(s.length() == 1) return
false;//单字符无配对
if(s.length() == 0) return
true;//空字符串
Stack stack = new Stack();
for(int i = 0; i
< s.length(); i++){
if(stack.empty()){
stack.push(s.substring(i,i+1)); continue; }//空栈直接入
if((s.substring(i,i+1).equals("}")
&& stack.peek().equals("{")) ||
(s.substring(i,i+1).equals(")") &&
stack.peek().equals("(")) || (s.substring(i,i+1).equals("]")
&&
stack.peek().equals("[")))
stack.pop();//配对则栈顶出栈
else
stack.push(s.substring(i,i+1));//否则入栈
}
if(stack.empty()) return
true;//空栈则表示全配对
else return false;
}
}
优化代码:
public class Solution {
public boolean
isValidParentheses(String s) {
Stack stack = new Stack();
for (Character c : s.toCharArray()) {
if ("({[".contains(String.valueOf(c)))
{//左括号入栈
stack.push(c);
} else
{//配对出栈
if (!stack.isEmpty()
&& is_valid(stack.peek(), c))
{
stack.pop();
} else {
return false;
}
}
}
return stack.isEmpty();
}
private boolean
is_valid(char c1, char c2) {
return (c1 == '('
&& c2 == ')') || (c1 == '{'
&& c2 == '}')
|| (c1 ==
'[' && c2 == ']');
}
}