力扣记录:链表——203 移除链表元素,707 设计链表

本次题目

  • 203 移除链表元素
  • 707 设计链表

203 移除链表元素

  • 注意:删除头结点和删除其他结点的操作不同。可以设置一个虚拟头结点再进行删除。虚拟头结点指向的下一个结点为原来的头结点,因此最后返回的头结点也是虚拟头结点指向的下一个结点;定义当前位置和指向当前位置的指针,while循环判断当前结点的值是否要删除。
class Solution {
    public ListNode removeElements(ListNode head, int val) {
        //当链表为空时直接返回头结点
        if(head == null){
            return head;
        }
        //设置虚拟头结点
        ListNode virtualHead = new ListNode(0, head);
        //开始判断
        ListNode front = virtualHead;
        ListNode now = head;
        while(now != null){
            if(now.val == val){
                front.next = now.next;
            }else{
                front = now;
            }
            now = now.next;
        }
        return virtualHead.next;
    }
}

707 设计链表

  • 注意:下标index从0开始,链表长度为size,因此下标的合法范围为[0,size-1]。可以设置一个虚拟头结点进行操作,遍历时要注意当前指向的位置:输出第index个值时指向的就是当前节点,因此遍历时i可以等于index;插入和删除都是需要指向前一个节点,遍历时i不能等于index,否则就插入删除到index+1位置的节点了。
class ListNode{
    //属性
    int val;
    ListNode next;
    //构造器
    ListNode(){}
    ListNode(int val){
        this.val = val;
    }
    ListNode(int val, ListNode next){
        this.val = val;
        this.next = next;
    }
}
class MyLinkedList {
    //长度属性
    int size;
    //虚拟头节点
    ListNode head;

    //初始化
    public MyLinkedList() {
        size = 0;
        head = new ListNode(0);
    }
    
    //获取链表第index个节点的值
    public int get(int index) {
        //如果索引无效,则返回-1
        if(index<0 || index >= size){
            return -1;
        }
        //从虚拟头节点开始
        ListNode cur = head;
        //i=index时输出的就是第index个值
        for(int i = 0; i <= index; i++){
            cur = cur.next;
        }
        return cur.val;

    }
    
    public void addAtHead(int val) {
        //直接调用下面的插入函数
        addAtIndex(0,val);
    }
    
    public void addAtTail(int val) {
        //直接调用下面的插入函数
        addAtIndex(size,val);
    }
    
    public void addAtIndex(int index, int val) {
        //如果index大于链表长度,不插入
        if(index > size){
            return;
        }
        //如果index小于0,在头部插入
        if(index < 0){
            index = 0;
        }
        //从虚拟头节点开始
        ListNode cur = head;
        //i=index-1时就是插入到第index位置前
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        //开始插入
        ListNode addNode = new ListNode(val);
        addNode.next = cur.next;
        cur.next = addNode;
        //长度改变
        size++;
    }
    
    public void deleteAtIndex(int index) {
        //如果index无效,不删除
        if(index < 0 || index >= size){
            return;
        }
        //从虚拟头节点开始
        ListNode cur = head;
        //i=index-1时就是指向第index个位置的指针
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        //开始删除
        cur.next = cur.next.next;
        //长度改变
        size--;
    }
}

你可能感兴趣的:(java,算法,链表)