数据结构(Java):力扣单链表面试OJ题

目录

1、题一:获取链表倒数第k个节点

1.1 思路解析

1.2 代码

2、题二:逆置单链表

2.1 思路解析

2.2 代码

3、题三:移除链表元素(删除所有某一数值的节点,且一次循环)

3.1 思路解析

3.2 代码

4、题四:获取链表的中间节点

 4.1 思路解析

4.2 代码

5、题五:分割链表

5.1 思路解析

5.2 代码

 6、题六:判断链表是否回文

6.1 思路解析

6.2 代码

7、题七:相交链表(找出相交节点)

7.1 思路解析 

7.2 代码

8、题八:判断链表是否带环

8.1 思路解析 

8.2 代码

9、题九:求环的入口点

9.1 思路解析

9.2 代码

10、题十:合并两个有序链表

10.1 思路解析

10.2 代码


1、题一:获取链表倒数第k个节点

. - 力扣(LeetCode)

1.1 思路解析

此题我们使用双指针法求解。

首先,我们要知道,倒数的第k个节点,距离倒数第一个节点还需要移动k-1次

1.那么我们可以定义出两个指针,分别为fast和slow,他们初始均值均为头结点head

2.先让fast指针向后移动k-1次,slow指针保持不动。

3.接着,fast指针和slow指针同步后移直至fast指针指向最后一个节点。

4.此时,slow指针所指向的位置就是倒数第k个节点。

原理:这个解题思路的原理就是,fast指针和slow指针始终保持着k-1个移动次数,而当fast指针指向最后一个节点(即倒数第一个节点)时,那么slow指针指向的就是倒数第k个节点。

注意事项:

1.k的值是否合法 2.头指针head是否为null

1.2 代码

public int kthToLast(ListNode head, int k) {
        //当头指针为空时
        if (head == null) {
            return Integer.MAX_VALUE;
        }

        //当k的值<=0时
        ListNode cur = head;
        int size = 0;
        while (cur != null) {
            size++;
            cur = cur.next;
        }
        if (k <= 0) {
            return Integer.MAX_VALUE;
        }

        //双指针法求解
        ListNode fast = head;
        ListNode slow = head;

        //先让fast指针移动k-1次
        int count = 0;
        while (count != k - 1) {
            fast = fast.next;
            //当k值>size时(不合法),fast指针移动的k-1次中,必然会指向null
            if (fast == null) {
                return Integer.MAX_VALUE;
            }
            count++;
        }

        //slow和fast同步后移,直至fast指向倒数第一个元素(slow和fast始终保持k-1个移动次数)
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        //返回val
        return slow.val;
    }

2、题二:逆置单链表

. - 力扣(LeetCode)

2.1 思路解析

此题我们使用头插法求解。

这道题的思路很简单:从第二个节点开始,每得到一个节点,将此节点进行头插操作。

注意:要将最开始的头结点的next置为null(因为链表的头节点在逆置后就变成了尾结点)

2.2 代码

public ListNode reverseList(ListNode head) {
        //当头结点head为空时
        if (head == null) {
            return head;
        }
        //获取第二个节点,将第一个节点的next置为null
        ListNode cur = head.next;
        head.next = null;
        
        //头插
        while (cur != null) {
            //先获取当前节点的下一个节点
            ListNode curN = cur.next;
            //将当前节点的next指向头结点(头插)
            cur.next = head;
            //将head更新为新头插的节点
            head = cur;
            //更新cur,继续头插
            cur = curN;
        }

        //返回逆置后的头结点
        return head;
    }

3、题三:移除链表元素(删除所有某一数值的节点,且一次循环)

. - 力扣(LeetCode)

3.1 思路解析

此题我们使用双指针法求解。

1.我们定义两个指针分别为prev(初始指向head头结点 即第一个节点)和cur(初始指向head的next节点 即第二个节点)。

2.遍历链表。

3.当cur所指节点的值为所要删除的val值时,cur向后移动,prev不动,且将prev的next指针指向移动后的cur,完成节点的删除。

4.若cur所指节点值不是所要删除的val值时,cur和prev同步后移一位。

5.当cur指向null时,遍历完成。

6.经过上述操作,除第一个节点外,其余的节点均已删除完成,我们只需额外判断第一个节点的值是否为要删除的val值即可。

3.2 代码

public ListNode removeElements(ListNode head, int val) {
        //当head为空时
        if(head == null) {
            return head;
        }

        //双指针法求解
        ListNode prev = head;
        ListNode cur = head.next;


        while (cur != null) {
            //判断当前节点的值是否为要删除的val值
            if (cur.val == val) {//若是,删除节点
                cur = cur.next;
                prev.next = cur;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值