代码随想录算法训练营第三天 |203.移除链表元素、 707.设计链表、206.反转链表

203.移除链表元素

题目链接:力扣题目链接

思路:考虑到删除有两种情况,删除头节点个删除链表中间的节点,所以操作是不一样的。看过题解后,设立一个虚拟链表吧头结点放入到next后,之后返回虚拟链表头节点的next就可以完美避免要删除对象有两种情况,就变成了只删除链表中间的节点。(图:引用“代码随想录”)

然后解题过程中对于当前节点和next的节点就分不清楚了,一直在用node和nextnode指代不清楚,用pre和current会更加清楚。

/**
 * 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) {
        // 创建一个虚拟头节点,指向原链表头部
        ListNode dummy = new ListNode(0);
        dummy.next = head;

        // 用两个指针遍历链表,prev和current
        ListNode prev = dummy;
        ListNode current = head;

        while (current != null) {
            if (current.val == val) {
                // 如果当前节点需要删除,前一个节点指向下一个节点
                prev.next = current.next;
            } else {
                // 如果不需要删除,则更新prev
                prev = current;
            }
            // 无论如何,current继续往后走
            current = current.next;
        }

        // 返回链表的新头节点,即dummy的下一个节点
        return dummy.next;
    }
}

707.设计链表

题目链接:力扣题目链接

思路:看到题目是蒙的,不会创建“ListNode”类。还有关键要初始化“MyLinkedList”,其他的只要注意控制size边界即可。        

class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) {
        this.val = val;
    }
}
class MyLinkedList {
    ListNode head;
    int size;

    public MyLinkedList() {
        head = new ListNode(0);  // 初始化虚拟头结点
        size = 0;
    }
}

206.反转链表

题目链接:力扣题目链接

思路:两个指针一个前一个后不停交换位置,往之前的队尾推进。重点在翻转之后的node中的next如何指向。需要一个temp暂存current的next,很巧妙。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值