前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【力扣/牛客刷题】链表篇

【力扣/牛客刷题】链表篇

作者头像
xxxflower
发布2023-04-16 17:44:35
1730
发布2023-04-16 17:44:35
举报
文章被收录于专栏:《数据结构》《数据结构》

203.移除链表元素

题目OJ链接:203. 移除链表元素

在这里插入图片描述
在这里插入图片描述

【题目分析】我们先来分析一下我们需要注意什么

  1. 链表为空
  2. 链表中只有一个数字
  3. 所要删除的数字位于链表中间(即最普通的情况)
  4. 链表中要寻找的数字从头开始出现多次(例如:23 23 23 45 23)(删除23)

我们先设置两个值:

  1. cur:代表当前需要删除的节点
  2. prev:代表当前需要删除的节点的前驱
在这里插入图片描述
在这里插入图片描述

我们要怎么删除34呢?步骤如下:

请添加图片描述
请添加图片描述
在这里插入图片描述
在这里插入图片描述

如果不是所要求的值,则执行else往后走。直到cur == null 综上我们可以得到代码:

代码语言:javascript
复制
/**
 * 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) {
        //1. 链表为空
        if(head == null){
            return null;
        }
        //2. 所要删除的数字位于链表中间(即最普通的情况)
        ListNode cur = head.next;
        ListNode prev = head;
        while(cur != null){
            if(cur.val == val){
                prev.next = cur.next;
                cur = cur.next;
            }else{
                prev = cur;
                cur = cur.next;
            }
        }
        //3. 链表中要寻找的数字从头开始出现多次(例如:23 23 23 45  23)(删除23)此时以上代码执行完时,还有第一个没有删除,因此需要在判断一下
        if(head.val == val){
            head = head.next;
        }
        return head;
    }
}
在这里插入图片描述
在这里插入图片描述

206.反转链表

题目OJ链接:206. 反转链表

在这里插入图片描述
在这里插入图片描述

【题目分析】

在这里插入图片描述
在这里插入图片描述
  1. 先把0x89存起来,方便之后与后续链表产生关系 ListNode cur = head.next;
  2. 然后将0x89置为空 head.next = null;
  3. 由以下代码得:
请添加图片描述
请添加图片描述

此处的代码为本题的关键,如果还不理解可以调试一下,一步步走。

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
/**
 * 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) {
        //1.没有节点
        if(head == null){
            return null;
        }
        //2.只有一个节点
        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;
    }
}
在这里插入图片描述
在这里插入图片描述

876. 链表的中间结点

题目OJ链接:876.链表的中间结点

在这里插入图片描述
在这里插入图片描述

【题目分析】本题可以利用快慢指针来完成。

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
/**
 * 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 middleNode(ListNode head) {
        ListNode fast = head;
        ListNode slow = head;
        while((fast != null)&&(fast.next != null)){
            fast = fast.next.next;
            slow = slow.next;
        }
        return slow;
    }
}
在这里插入图片描述
在这里插入图片描述

链表中倒数第k个结点

链表中倒数第k个结点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode FindKthToTail(ListNode head,int k) {
        if(k < 0 ||head == null){
             return null;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(k-1 != 0){
             fast = fast.next;
            if(fast == null){
                return null;
            }
            k--;
        }
        while(fast.next != null){
            fast = fast.next; 
            slow = slow.next;
        }
        return slow;

    }
}

21. 合并两个有序链表

21. 合并两个有序链表

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:定义一个虚拟头结点,比较两个链表头结点的值的大小。

在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
/**
 * 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 mergeTwoLists(ListNode head1,
     ListNode head2) {
        ListNode newHead = new ListNode(-1);
        ListNode tmp = newHead;
        while(head1 != null && head2 != null){
            if(head1.val < head2.val){
                tmp.next = head1;
                head1 = head1.next;
            }else{
                tmp.next = head2;
                head2 = head2.next;
            }
            tmp = tmp.next;
        }
        if(head1 != null){
            tmp.next = head1;
        }
        if(head2 != null){
            tmp.next = head2;
        }
        return newHead.next;
    }
}

CM11 链表分割

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
…            return as;
        }
        be.next = as;
        if(as !=null){
            ae.next = null;
        }
        return bs;
    }
}

OR36 链表的回文结构

题目Oj:OR36 链表的回文结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码语言:javascript
复制
import java.util.*;

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class PalindromeList {
    public boolean chkPalindrome(ListNode head) {
        // write code here
        if(head == null){
            return false;
        }
        if(head.next == null){
            return true;
        }
        ListNode fast = head;
        ListNode slow = head;
        while(fast != null && fast.next != null){
            fast = fast.next.next;
            slow = slow.next;
        }
        ListNode cur = slow.next;;
        while(cur != null){
            ListNode curNext = cur.next;
            cur.next = slow;
            slow = cur;
            cur = curNext;
        }
        while(head != slow){
            if(head.val != slow.val){
                return false;
            }
            if(head.next == slow){
                return true;
            }
            head = head.next;
            slow = slow.next;
        }
        return true;
    }
}
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-01-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 203.移除链表元素
  • 206.反转链表
  • 876. 链表的中间结点
  • 链表中倒数第k个结点
  • 21. 合并两个有序链表
  • CM11 链表分割
  • OR36 链表的回文结构
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com