网站建设吴中区营销策略有哪几种
网站建设吴中区,营销策略有哪几种,想要个网站,电子签名在线生成器文章目录 引言反转单链表题目描述示例#xff1a;题解思路代码实现#xff1a; 移除链表元素题目描述#xff1a;示例思路解析#xff1a; 链表的中间结点题目描述#xff1a;示例#xff1a;思路解析代码实现如下#xff1a; 链表中倒数第k个结点题目描述示例思路解析题解思路代码实现 移除链表元素题目描述示例思路解析 链表的中间结点题目描述示例思路解析代码实现如下 链表中倒数第k个结点题目描述示例思路解析代码实现如下 总结 引言
单链表的操作算法是笔试面试中较为常见的题目。 本文将着重介绍平时面试中常见的关于链表的应用题目马上要进行秋招了。希望对你们有帮助 _
反转单链表
题目描述
给定一个单链表的头结点pHead(该头节点是有值的比如在下图它的val是1)长度为n反转该链表后返回新链表的表头。
数据范围 0≤n≤1000
要求空间复杂度 O(1) 时间复杂度 O(n) 。
如当输入链表{1,2,3}时 经反转后原链表变为{3,2,1}所以对应的输出为{3,2,1}。 以上转换过程如下图所示
示例 题解思路
1定义两个指针 pser 和 sur sur 在前 pser 在后。 2sur用于遍历pser用于交换位置并插入到头节点前面
3将head里面的next置为null
4每一次插入顺序为将sur的位置付给pser然后sur向前走一步令pser里的next设为head这时候pser为头节点我们再将pser赋给head作为新的头节点。每循环一次头节点向前走一步
5循环上述过程直至 sur 到达链表尾部
代码实现
import java.util.*;/** public class ListNode {* int val;* ListNode next null;* public ListNode(int val) {* this.val val;* }* }*/public class Solution {/*** 代码中的类名、方法名、参数名已经指定请勿修改直接返回方法规定的值即可*** param head ListNode类* return ListNode类*/public ListNode ReverseList (ListNode head) {// write code hereif (head null || head.next null) {return head;}ListNode sur head.next;ListNode pser head;head.next null;while (sur ! null) {pser sur;sur sur.next;pser.next head;head pser;}return head;}
}移除链表元素
题目描述
给你一个链表的头节点 head 和一个整数 val 请你删除链表中所有满足 Node.val val 的节点并返回 新的头节点 。
示例 思路解析
我们依旧需要对该单链表进行判断如果为空就直接返回
由于我们需要删除很多个这样的节点但是我们的单链表却是单向的按照上面的写法我们则需要遍历很多次单链表大大的增加了复杂度我们为了降低时间复杂度使它降为O(N);
我们设两个遍历节点进行遍历一个在前为cur一个在后prev 前面的cur负责进行遍历删除后面的prev负责跟在cur后面记录cur的上一节点
当cur下一节点不是我们所要删除的元素时这时候我们将prev变为我们当前节点的cur而cur变为当前节点的next 当前的删除方法只能删除第一个节点以后的元素所以我们还需要处理第一个元素是我们所需要删除的情况。
代码实现如下
/*** 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) {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;}}if(head.val val) {head head.next;}return head;}
}链表的中间结点
题目描述
给你单链表的头结点 head 请你找出并返回链表的中间结点。
如果有两个中间结点则返回第二个中间结点。
示例 思路解析
我们依旧两个定义两个指针一个一次性走两步一个一次性走一步
当快的指针到达终点时慢的指针所☞指位置就是我们所需要的中间位置
就像大人与小孩子一起走路大人的速度是小孩子的两倍 大人到达终点时小孩子才走到一半
代码实现如下
/*** 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;//1、找中间节点while (fast ! null fast.next ! null) {fast fast.next.next;slow slow.next;}return slow;}
}注意fast ! null与fast.next ! null不可以调换
链表中倒数第k个结点
题目描述
输入一个链表输出该链表中倒数第k个结点。
示例 输入 1,{1,2,3,4,5} 返回值 {5} 思路解析
依旧是两个指针分别为fast和slowfast先出发fast出发k-1步后slow出发中间保持k-1个节点的距离fast所指向下一节点为null时结束 代码实现如下
import java.util.*;
/*
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;//1. fast走k-1步while (k - 1 ! 0) {fast fast.next;if (fast null) {return null;}k--;}//2、3、while (fast.next ! null) {fast fast.next;slow slow.next;}return slow;}
}总结
关于《【数据结构】 单链表面试题讲解》就讲解到这儿感谢大家的支持欢迎各位留言交流以及批评指正如果文章对您有帮助或者觉得作者写的还不错可以点一下关注点赞收藏支持一下
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/88434.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!