剑指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();
    }
}

posted @ 2021-09-11 18:56  程序员khaos  阅读(41)  评论(0编辑  收藏  举报