链表之十大经典面试题

好好打球,努力码代码 ,一起加油! 


目录

1. 删除链表中等于给定值 val 的所有节点。

思路分析

代码演示

2.反转一个单链表 

思路分析

代码演示

 3.返回链表的中间节点

思路分析 

代码演示

 4.链表的回文结构

 思路分析

代码演示

 5.输入一个链表,输出该链表中倒数第k个结点

思路分析 

代码演示

6.将两个有序链表合并为一个

思路分析 

代码演示

7. 链表分割

思路分析:

代码演示 

8.求两个链表的交点

思路分析 

代码演示

9. 给定一个链表,判断链表中是否有环

思路分析 

代码演示

10.求环的入口点

思路分析

代码演示


1. 删除链表中等于给定值 val 的所有节点。

 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点

删除前 

删除后 

思路分析

 分情况讨论:

1.当链表为空时直接返回null;

2.当链表不为空时,定义一个前驱节点prve和cur,遍

历链表,当cur.val == val时,如图所示,要想删除val=6的值,让prev.next = cur.next,自然就删除了6这个节点,cur=cur.next,继续遍历链表,当要删除节点为最后一个节点时,将prev.next置空。

注意事项:当删除完之后要返回来看看头结点的val是否是要删除的值

代码演示

class Solution {
    public ListNode removeElements(ListNode head, int val) {
        if(head == null){
            return null;
        }//链表为空直接返回
        ListNode prev = head;
        ListNode cur = prev.next;
        while(cur!= null){
            if(cur.val == val){//为要删除的元素时,更改节点指向
                prev.next = cur.next;
                cur = cur.next;
            }else{
                prev = cur;//当不是要删除的元素是,让cur和prev后移
                cur = cur.next;
            }
        }
        if(head.val == val){//当遍历删除完之后返回看看头结点是否为要删除的结点
            return head.next;
        }
        return head;
    }
}

2.反转一个单链表 

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

反转前

反转后

思路分析

分情况讨论:

1.当链表为空时直接返回null;

2.当链表只有一个头结点的时候,返回head;

3.当链表有两个及以上的节点时,原地移动列表,定义一个cur节点,cur = head.next;定义一个curNext来暂存cur之后的节点,以防在反转列表时将后面的节点丢失,先将head置为空,cur.next=head;head= cur;cur= curNext;依次循环知道cur为空反转完成

代码演示

class Solution {
    public ListNode reverseList(ListNode head) {
        if(head == null){
            return null;
        }//当链表为空直接返回null
        if(head.next == null){
            return head;
        }//当链表只有头结点时,无需反转,直接返回头结点
        //当有两个及两个以上节点时
        ListNode cur = head.next;
        head.next =null;//先将头结点的next置为空
        while(cur != null){
            ListNode curNext = cur.next;//定义一个curNext来保存后面的结点
            cur.next = head;//让当前节点的next指向上一个节点
            head = cur;//head更新为下一个节点
            cur = curNext;//cur更新为下一个节点
        }
        return head;//最后返回头结点
    }
}

 3.返回链表的中间节点

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值