剑指offer计划11(双指针简单)---java
1.1、题目1
剑指 Offer 18. 删除链表的节点
1.2、解法
双指针遍历,遇到坑就叫前一个下次跳多一步,坑里的跳一步。
1.3、代码
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode deleteNode(ListNode head, int val) {
if(head==null) return null;
ListNode node = new ListNode();
node.next=head;
ListNode pre = node;
while(head!=null){
if(head.val==val){
node.next=head.next;
head=head.next;
break;
}
node=node.next;
head=head.next;
}
return pre.next;
}
}
2.1、题目2
剑指 Offer 22. 链表中倒数第k个节点
2.2、解法
这题第一种解法直接时间差点崩,栈执行时间长,用队列差不多,队列更惨,内存都多一点。
想要追求性能和时间好的,可以写顺序或者双指针,这个主题是双指针,我还是用了队列,哈哈哈哈哈
2.3、代码
第一种
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
Stack<ListNode> s = new Stack();
while(head!=null){
s.push(head);
head=head.next;
}
for(int i=1;i<k;i++){
s.pop();
}
return s.peek();
}
}
第二种
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode getKthFromEnd(ListNode head, int k) {
Deque<ListNode> s = new ArrayDeque();
while(head!=null){
s.addLast(head);
head=head.next;
}
for(int i=1;i<k;i++){
s.pollLast();
}
return s.pollLast();
}
}