链表OJ题(上)

✅每日一练:876. 链表的中间结点 - 力扣(LeetCode)


 解题思路:

    定义快慢指针,让快指针走2步,慢指针走1步,当fast或者fast.next为空时,走完链表,此时slow就是中间位置
public ListNode middleNode(ListNode head) {
        //定义快慢指针,让快指针走2步,慢指针走1步,当fast或者fast.next为空时,走完链表,此时slow就是中间位置
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }

✅每日一练:203. 移除链表元素 - 力扣(LeetCode)


 

 解题思路:

   题目意思让我们删除链表中相同的元素,看图

 

public ListNode removeElements(ListNode head, int val) {
        //判断头结点是否为空
        if (head == null) {
            return null;
        }
        //定义两个指针
        ListNode prev = head;
        ListNode cur = head.next;
        //循环条件
        while (cur != null) {
            if (cur.val == val) {
                prev.next = cur.next;
                cur = cur.next;

            } else {
                prev = cur;
                cur = cur.next;
            }
        }
        //如果第一个元素就是我们要删除的节点,直接让head = head.next
        if (head.val == val) {
            head = head.next;
        }
        return head;
    }

✅每日一练:206. 反转链表 - 力扣(LeetCode)

 

解题思路:

   题目意思很简单 ,就是逆序一个单链表,思路就是先把头结点置空,然后将后面的节点挨个进行头插,反转链表,逻辑看似简单,实现起来还是有很多细节的,常看,不然就会忘,如图

这里面还有细节,就是头结点为空时,说明没有节点,如果head.next = null,说明就一个节点,直接返回头结点就可:

public ListNode reverseList(ListNode head) {
        if (head == null) {
            return null;
        }
        if (head.next == null) {
            return head;
        }
        ListNode cur = head.next;
        //将头结点置空,将后面的节点逐一进行头插
        head.next = null;
        while (cur != null) {
            ListNode curNext = cur.next;
            cur.next = head;
            head = cur;
            cur = curNext;
        }
        return head;
    }

✅每日一练:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)


 

 解题思路:

   定义快慢指针,让快指针先走k-1步,走完以后让快慢指针同时走一步,当快fast.next为空时,说明走完了,此时slow就是我们要找的元素,非常巧妙,是谁想到的,真是太强了,我画个图吧

 

public ListNode FindKthToTail(ListNode head, int k) {
        if (k <= 0 || head == null) {
            return null;
        }
        //定义快慢指针,让快指针走2步,慢指针走k-1步,再让slow和fast同时走一步,让fast.next为空时,
        //表示走完了,此时的慢指针就是倒数第k个节点的数值
        ListNode fast = head;
        ListNode slow = head;
        //fast走k-1步
        while (k - 1 != 0) {
            fast = fast.next;
            //当k的值大于链表的长度时,用于判断下一个fast是否为空
            if (fast == null) {
                return null;
            }
            k--;
        }
        while (fast.next != null) {
            fast = fast.next;
            slow = slow.next;
        }
        return slow;
    }

✅每日一练:21. 合并两个有序链表 - 力扣(LeetCode)


 

 解题思路:

    这题有点像合并两个有序数组,定义一个临时的头结点,将两个链表的头结点的值进行比较,哪个小作为头结点,然后交叉比较两个链表,比较值的大小,小的房前面,形成有序,大致思路就是这样:

public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        ListNode newHead = new ListNode();
        ListNode tmp = newHead;
        while (list1 != null && list2 != null) {
            if (list1.val < list2.val) {
                tmp.next = list1;
                list1 = list1.next;
                tmp = tmp.next;
            } else {
                tmp.next = list2;
                list2 = list2.next;
                tmp = tmp.next;
            }
        }
        if (list1 != null) {
            tmp.next = list1;
        }
        if (list2 != null) {
            tmp.next = list2;
        }
        //返回新的头结点
        return newHead.next;
    }

  • 18
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bc_小徐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值