【leetcode速通java版】03——移除链表元素,设计链表,反转链表

简介: 【leetcode速通java版】03——移除链表元素,设计链表,反转链表

leetcode-T203移除链表元素

36f84a39bc9246dabe86311f4ccdcf76.png


解法:

还挺简单的,为了对第一个数据归一化操作,定义头指针,不含数据的虚拟头节点。

/**
 * 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;
        }
        ListNode p = new ListNode(-1, head); 
        ListNode pre = p;
        ListNode cur = head;
        while(cur != null) {
           if(cur.val == val) {
               pre.next = cur.next;
           } else {
               pre = cur;
           }
           cur = cur.next;
        }
        return p.next;
    }
}

leetcodeT707 设计链表


3b5b3319499b4ca7a3ea224e35055239.png

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(-1);
    }
    public int get(int index) {
        if(index > size - 1 || index < 0) { 
            return -1;
        }
        ListNode cur = head;
        while(index-- >= 0) { // 包含虚拟头结点,所以查找索引为index + 1 的结点
            cur = cur.next;
        }
        return cur.val;
    }
    public void addAtHead(int val) {
    // addAtIndex(0, val);
       ListNode temp = new ListNode(val);
       temp.next = head.next;
       head.next = temp;
       size++;
    }
    public void addAtTail(int val) {
        int index = size - 1;
        ListNode cur = head;
        while(index-- >= 0) {
            cur = cur.next;
        }
        ListNode temp = new ListNode(val);
        cur.next = temp;
        size++;
    }
    public void addAtIndex(int index, int val) {
        if(index > size) {
            return;
        }
        size++;
        if(index == size) {
            addAtTail(val);
            return;
        }
        if(index < 0) {
         // index = 0;
            addAtHead(val);
            return;
        }
        ListNode cur = head;
        while(index-- > 0) { // 找到前一个结点
            cur = cur.next;
        }
        ListNode temp = new ListNode(val);
        temp.next = cur.next;
        cur.next = temp;
    }
    public void deleteAtIndex(int index) {
        if(index < 0 || index > size - 1) {
            return;
        }
        size--;
         ListNode cur = head;
        while(index-- > 0) { // 找到前一个结点
            cur = cur.next;
        }
        cur.next = cur.next.next;
    }
}
/**
 * Your MyLinkedList object will be instantiated and called as such:
 * MyLinkedList obj = new MyLinkedList();
 * int param_1 = obj.get(index);
 * obj.addAtHead(val);
 * obj.addAtTail(val);
 * obj.addAtIndex(index,val);
 * obj.deleteAtIndex(index);
 */

leetcodeT206 反转链表


22d66f514b254adc9749f18422eb238e.png

/**
 * 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 reverseList(ListNode head) {
        ListNode prev = head;
        if(head == null) {
            return head;
        }
        ListNode cur = head.next;
        while(cur != null) {
            ListNode temp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        head.next = null;
        return prev;
    }
}


相关文章
|
6天前
|
程序员
【刷题记录】移除链表元素
【刷题记录】移除链表元素
|
4天前
|
算法
LeetCode第24题两两交换链表中的节点
这篇文章介绍了LeetCode第24题"两两交换链表中的节点"的解题方法,通过使用虚拟节点和前驱节点技巧,实现了链表中相邻节点的交换。
LeetCode第24题两两交换链表中的节点
|
4天前
|
存储 算法
LeetCode第86题分隔链表
文章介绍了LeetCode第86题"分隔链表"的解法,通过创建两个新链表分别存储小于和大于等于给定值x的节点,然后合并这两个链表来解决问题,提供了一种简单易懂且操作原链表的解决方案。
LeetCode第86题分隔链表
|
4天前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
4天前
|
算法
LeetCode第23题合并 K 个升序链表
这篇文章介绍了LeetCode第23题"合并K个升序链表"的解题方法,使用分而治之的思想,通过递归合并链表的方式解决了这个难题。
LeetCode第23题合并 K 个升序链表
|
4天前
|
算法
LeetCode第92题反转链表 II
文章分享了LeetCode第92题"反转链表 II"的解法,通过使用四个指针来记录和更新反转链表段的头部、尾部以及前一个和后一个节点,提供了一种清晰且易于理解的解决方案。
LeetCode第92题反转链表 II
|
4天前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
4天前
|
算法
LeetCode第21题合并两个有序链表
该文章介绍了 LeetCode 第 21 题合并两个有序链表的解法,通过创建新链表,依次比较两个链表的头节点值,将较小的值插入新链表,直至其中一个链表遍历完,再将另一个链表剩余部分接到新链表后面,实现合并。
LeetCode第21题合并两个有序链表
|
4天前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
5天前
|
存储 C语言
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍
【数据结构】c语言链表的创建插入、删除、查询、元素翻倍