链表

LeetCode——92. 反转链表 II

删除回忆录丶 提交于 2020-03-02 13:18:58
反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。 说明: 1 ≤ m ≤ n ≤ 链表长度。 示例: 输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL https://leetcode-cn.com/problems/reverse-linked-list-ii/ 迭代 1 -> 2 -> 3 -> 4 -> 5 -> NULL 1 -> 3 -> 2 -> 4 -> 5 -> NULL 1 -> 4 -> 3 -> 2 -> 5 -> NULL 我们可以看出来,总共需要n-m步即可,第一步是将结点3放到结点1的后面,第二步将结点4放到结点1的后面。 比如刚开始,pre指向结点1,cur指向结点2,然后我们建立一个临时的结点t,指向结点3(注意我们用临时变量保存某个结点就是为了首先断开该结点和前面结点之间的联系,这可以当作一个规律记下来), 然后我们断开结点2和结点3,将结点2的next连到结点4上,也就是 cur->next = t->next, 再把结点3连到结点1的后面结点(即结点2)的前面,即 t->next = pre->next, 最后再将原来的结点1和结点2的连接断开,将结点1连到结点3,即 pre->next = t。 这样我们就完成了将结点3取出,加入结点1的后方。第二步将结点4取出

LeetCode——206. 反转链表

时间秒杀一切 提交于 2020-03-02 12:48:49
反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? https://leetcode-cn.com/problems/reverse-linked-list/ 迭代 思路是在原链表之前建立一个空的newHead,因为首节点会变,然后从head开始,将之后的一个节点移到newHead之后,重复此操作直到head成为末节点为止,代码如下: c++ lass Solution { public: ListNode* reverseList(ListNode* head) { ListNode *newHead = NULL; while (head) { ListNode *t = head->next; head->next = newHead; newHead = head; head = t; } return newHead; } }; java class Solution { public ListNode reverseList(ListNode head) { //申请节点,pre和 newHead,pre指向null ListNode pre = null; ListNode newHead = head; ListNode tmp =

实战Linux Bluetooth编程(九) SDP层编程

て烟熏妆下的殇ゞ 提交于 2020-03-02 12:31:17
先前的章节谈过SDP协议。但没有具体讲如何编程。 BlueZ提供的SDP API,常见的如下: 1. sdp_session_t *sdp_create(int sk, uint32_t flags) 参数1:sk: socket 参数2:SDP flags. 取值如下: #define SDP_RETRY_IF_BUSY 0x01 #define SDP_WAIT_ON_CLOSE 0x02 #define SDP_NON_BLOCKING 0x04 创建一个新的Session为了异步查找。 Session结构如下: typedef struct { int sock; int state; int local; int flags; uint16_t tid; // Current transaction ID void *priv; } sdp_session_t; sdp_create 只是简单的创建一个空间将Session指针返回。并将sk和flags传入Session对应值。 同时,会创建transaction并将指针给 priv . struct sdp_transaction { sdp_callback_t *cb; void *udata; uint8_t *reqbuf; sdp_buf_t rsp_concat_buf; uint32_t reqsize;

leetcode 206 反转链表

馋奶兔 提交于 2020-03-02 12:09:28
原地算法 public static ListNode reverseListIterative(ListNode head) { ListNode prev = null; //前指针节点 ListNode curr = head; //当前指针节点 //每次循环,都将当前节点指向它前面的节点,然后当前节点和前节点后移 while (curr != null) { ListNode nextTemp = curr.next; //临时节点,暂存当前节点的下一节点,用于后移 curr.next = prev; //将当前节点指向它前面的节点 prev = curr; //前指针后移 curr = nextTemp; //当前指针后移 } return prev; } 来源: CSDN 作者: 模式识别实验室主任 链接: https://blog.csdn.net/qq_35752161/article/details/104607387

Nginx原理

橙三吉。 提交于 2020-03-02 12:07:03
1. nginx基本介绍   1、nginx高并发原理( 多进程+epoll实现高并发 )       1. Nginx 在启动后,会有一个 master 进程和多个相互独立的 worker 进程。       2. 每个子进程只有一个线程,采用的 IO多路复用模型epoll,实现高并发。   2、epoll能实现高并发原理       1. epoll() 中内核则维护一个链表,epoll_wait 方法可以获取到链表长度,不为0就知道文件描述符准备好了。       2. 在内核实现中 epoll 是根据每个 sockfd 上面的与设备驱动程序建立起来的回调函数实现的。       3. 某个 sockfd 上的事件发生时,与它对应的回调函数就会被调用,来把这个 sockfd 加入链表,其他处于“空闲的”状态的则不会。       4. epoll上面链表中获取文件描述,这里使用内存映射(mmap)技术, 避免了复制大量文件描述符带来的开销        内存映射(mmap) :内存映射文件,是由一个文件到一块内存的映射,将不必再对文件执行I/O操作   3、nginx和apache比较     1)nginx相对于apache的优点         1. 轻量级,同样起web 服务,比apache 占用更少的内存及资源         2. 抗并发,nginx

LeetCode 160.Intersection of Two Linked Lists.求两个链表的交点

走远了吗. 提交于 2020-03-02 11:46:00
题目: 已知链表A的头节点指针headA,链表B的头节点指针headB,连个链表相交,求两链表交点对应的节点。 要求: 1、如果两个链表没有交点,则返回NULL 2、在求交点的过程中,不可以破坏链表的结构或者修改链表的数据域。 3、可以确保传入的链表A与链表B没有任何环 4、*实现算法尽可能使用时间复杂度O(n),控件复杂度O(1) 思路一: 遍历链表A,将A中节点对应的指针(地址),插入set 遍历链表B,将B中节点对应的指针(地址),在set中查找, 发现在set中的第一个节点指针,及时两个链表的交点。 代码: 使用set的方法,这种方法关键是理解,set中存储的是指针! //使用set的方法 #include < stdio . h > #include < iostream > #include < set > using namespace std ; struct ListNode { int val ; ListNode * next ; ListNode ( int x ) : val ( x ) , next ( NULL ) { } } ; //只是定义的时候表名它是指针类型 //传的参数可以直接在方法里面用,以前还在一直纠结 ListNode * getIntersectionNode ( ListNode * a , ListNode * b ) { set

HashMap O(1) 复杂度的分析

六月ゝ 毕业季﹏ 提交于 2020-03-02 11:38:27
**C++**在使用STL时,经常混淆的几个数据结构, map,hash Map,unordered_map 事实上,三个容器,有着比较大的区别. Map 内部数据的组织,基于红黑树实现,红黑树具有自动排序的功能,因此map内部所有的数据,在任何时候,都是有序的。 所以复杂度为 O(LogN) Hash map 基于哈希表,数据插入和查找的时间复杂度很低,几乎是常数时间,而代价是消耗比较多的内存。底层实现上,使用一个下标范围比较大的数组来存储元素,形成很多的桶,利用hash函数对key进行映射到不同区域(桶)进行保存。 插入 得到key, 通过hash函数得到hash值 根据hash值 找到对应的桶号(区域), hash值对(桶数)求模 存放key和value 在对应桶内 取值 分四步: 判断key,根据key算出索引。 根据索引获得索引位置所对应的键值对链表。 遍历键值对链表(当每个桶内只有一个元素时,查找时只进行一次比较),根据key找到对应的Entry键值对。 拿到value。 分析: 以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突

LeetCode 141. 环形链表

不羁岁月 提交于 2020-03-02 09:40:44
题目链接: https://leetcode-cn.com/problems/linked-list-cycle/ 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 示例 2: 输入:head = [1,2], pos = 0 输出:true 解释:链表中有一个环,其尾部连接到第一个节点。 示例 3: 输入:head = [1], pos = -1 输出:false 解释:链表中没有环。 进阶: 你能用 O(1)(即,常量)内存解决此问题吗? 快慢指针:快指针总是会追上慢指针,如果成环的话 1 bool hasCycle(struct ListNode *head) { 2 if(head==NULL||head->next==NULL) return false; 3 struct ListNode *slow=head; 4 struct ListNode *fast=head->next; 5 while(slow!=fast){ 6 if(fast==NULL||fast->next==NULL) return

Leetcode-数组&链表

可紊 提交于 2020-03-02 09:37:52
常见双指针技巧用法,只总结思路,具体边界判定想不清楚的时候稍微画个图就行了 1. 快慢指针判断链表是否含有环、环入口(快慢指针再次相遇即有环;再从头节点和快慢指针的相遇位置同速度向后,相遇点即为环入口)。 2. 快慢指针找链表中点、倒数第k个元素(快指针到达 Null 时慢指针所处位置即为中点;快指针先走k步,然后和慢指针一起同速度向后,快指针到达 Null 时慢指针的位置就是倒数第k个节点)。 3. 左右指针二分查找、在有序数组中找两数之和、反转数组 4. 滑动窗口,典型题包括 #76、#438、#3 76. 最小覆盖子串 https://leetcode-cn.com/problems/minimum-window-substring/ 给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。 示例: 输入: S = "ADOBECODEBANC", T = "ABC" 输出: "BANC" 说明: 如果 S 中不存这样的子串,则返回空字符串 ""。 如果 S 中存在这样的子串,我们保证它是唯一的答案。 解: 可以用滑动窗口技巧,left 和 right 指针都初始化为0,然后 right 向右滑动直到 s[left, ..., right] 中包括了T串中所有的字符,就得到一个可能的解,再令 left

环形链表简介和约瑟夫环的实现

巧了我就是萌 提交于 2020-03-02 07:57:14
环形链表简介 环形链表,类似于单链表,也是一种链式存储结构,环形链表由单链表演化过来。单链表的最后一个结点的链域指向NULL,而环形链表的建立,不要专门的头结点,让最后一个结点的链域指向链表结点。 简单点说链表首位相连,组成环状数据结构。 如图所示: 约瑟夫环简介: 约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。 假设现在约瑟夫环有5个人,从第1个开始报数,数到2的出列。 那么出圈的顺序为2—>4—>1—>5—>3 要实现约瑟夫环问题,得先构建一个环形链表,在分析出圈思路。 构建环形链表的思路如下: 1 创建第一个节点,并让头指针first指向该节点,形成自环。 2 我们每创建一个节点,就把该创建的节点加到环中,并把新节点的next指向first节点。 (first为头指针,curBoy为尾指针,boy表示一个节点对象) 代码如下: // 创建一个Boy类,表示一个节点 class Boy { private int no ; // 编号 private Boy next ; // 指向下一个节点,默认null public Boy ( int no ) { this . no = no ; }