代码随想录训练营day3|203、移除链表元素;707、设计链表 ;206、反转链表

203、移除链表元素

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。

 如果删除的不是头节点,思想比较简单,如果删除的是头结点又该怎么办呢?这里就涉及如下链表操作的两种方式:

  • 直接使用原来的链表来进行删除操作。
  • 设置一个虚拟头结点在进行删除操作。

来看第一种操作:直接使用原来的链表来进行移除。

/**
 * Definition for singly-linked list.
 * public 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 Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 不加头节点
        if(head == null){
            return head;
        }

        while(head != null && head.val == val){
            head = head.next;
        }

        // 当前的head可能会是null 所以下面的循环判断要判断cur而不是cur.next
        ListNode cur = head;
        while(cur != null){
            if(cur.next != null && cur.next.val == val){
                cur.next = cur.next.next;
            }else{
                cur = cur.next;
            }   
        }
        return head; 
    }
}

 注意:这里的else中的语句不能和if并列,除非把if换成while,否则会出现中间的结点漏删(同数组的暴力删除,每次删完之后,要i--)

第二种操作:设置虚拟头节点。

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 初始化虚拟头结点
        ListNode dummy = new ListNode(-1,head);
        ListNode cur = dummy;
        while(cur != null){
            while(cur.next != null && cur.next.val == val){
                cur.next = cur.next.next;
            }
            cur = cur.next;
        }
        return dummy.next; 
    }
}

注意:

1、这里第一个while循环判断,也不能写cur.next != null,因为每次循环cur都会指向下一个next结点,所以cur可能变成空结点;

2、第二个while循环必须包含cur.next != null,因为有cur.next = cur.next.next,所以会出现cur.next为空的情况;

707、设计链表

设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。

在链表类中实现这些功能:

get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。
addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。
addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。
addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val  的节点。如果 index 等于链表的长度,则该节点将附加到链表的末尾。如果 index 大于链表长度,则不会插入节点。如果index小于0,则在头部插入节点。
deleteAtIndex(index):如果索引 index 有效,则删除链表中的第 index 个节点。

//首先定义结点类,单链表
class ListNode{
    int val;
    ListNode next;
    ListNode(){};
    ListNode(int val){
        this.val = val;
    }
}

class MyLinkedList {
    //实例变量
    int size;
    //虚拟头节点
    ListNode head;

    public MyLinkedList() {
        //初始化实例变量的值
        size = 0;
        head = new ListNode(0);
    }
    
    public int get(int index) {
        if(index < 0 || index >= size){
            return -1;
        }
        ListNode cur = head;
        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) {
        if(index > size){
            return;
        }
        if(index<0){
            index = 0;
        }
        size++;
        //插入节点的前驱
        ListNode cur = head;
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        ListNode add_node = new ListNode(val);
        add_node.next = cur.next;
        cur.next = add_node; 
        
    }
    
    public void deleteAtIndex(int index) {
        if(index >= size || index < 0){
            return;
        }
        size--;
        //删除节点的前驱
        ListNode cur = head;
        for(int i = 0; i < index; i++){
            cur = cur.next;
        }
        cur.next = cur.next.next;
    }
}

 206、反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode pre = null;
        ListNode cur = head;
        ListNode temp = null;
        while(cur != null){
            temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
}

注意:ListNode pre = new ListNode(){} 和 ListNode pre = null不一样!不能写成前者

你可能感兴趣的:(链表,数据结构,java)