代码随想录-2023/06/30

73 阅读1分钟

今日题目:链表基础

203.移除链表元素

题目描述:删除所有满足节点值=val的节点

解题思路:

  1. 因为链表节点只保存了下一个节点目标,故需要双指针,curr指针记录当前遍历的指针,pre指针保存当前遍历指针的上一个节点,引入虚拟头节点处理边界情况即可

代码:

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        // 双指针: 引入虚拟头节点处理边界情况
        ListNode dumy = new ListNode(-1, head);

        ListNode pre = dumy;
        ListNode curr = head;

        while(curr != null){
            if(curr.val == val){
                pre.next = curr.next;

            }else pre = pre.next;
            curr = curr.next;
        }

        return dumy.next;
    }
}

707.设计链表

题目描述:设计一个单链表或者双向链表

解题思路:借用Java实现好的数据结构LinkedList

代码:

class MyLinkedList {
    LinkedList<Integer> list;
    public MyLinkedList() {
        list = new LinkedList<>();
    }
    
    public int get(int index) {
        int size = list.size();
        if(index >= size) return -1;
        return list.get(index);
    }
    
    public void addAtHead(int val) {
        list.addFirst(val);
    }
    
    public void addAtTail(int val) {
        list.addLast(val);
    }
    
    public void addAtIndex(int index, int val) {
        // 超出链表范围, 不执行插入操作
        if(index > list.size()) return;
        // 指定位置插入元素
        list.add(index, val);
    }
    
    public void deleteAtIndex(int index) {
        if(index >= list.size()) return;
        list.remove(index);
    }
}

206.反转链表

经典题目: 双指针,一个指针pre初始为null,一个指针curr遍历当前节点,对于每个节点,都将curr指向pre即可

代码:

class Solution {
    public ListNode reverseList(ListNode head) {
        // 引入虚拟头节点为 null, 避免有环
        ListNode pre = null;
        ListNode curr = head;
        while(curr != null){
            ListNode temp = curr.next;
            curr.next = pre;
            // 指针后移
            pre = curr;
            curr = temp;
        }
        return pre;
    }
}