链表

LeetCode:Remove Nth Node From End of List 移除链表倒第n项

感情迁移 提交于 2020-03-14 19:11:44
1、题目名称 Remove Nth Node From End of List(移除链表中倒数第n项) 2、题目地址 https://leetcode.com/problems/remove-nth-node-from-end-of-list/ 3、题目内容 英文:Given a linked list, remove the n th node from the end of list and return its head. 中文:给出一个链表,删去链表中的倒数第n项,返回链表首节点 例如: 给出链表:1->2->3->4->5,给出 n = 2,返回的链表为:1->2->3->5 4、解题方法1 删去链表的倒数第n项,有两种办法,一是将链表翻转,把正数第n项删去,再将链表翻转回去。 Java代码如下: /** * 功能说明:LeetCode 19 - Remove Nth Node From End * 开发人员:Tsybius2014 * 开发时间:2015年8月6日 */ public class Solution { /** * 删除链表中倒数第N项(从1开始计数) * @param head 链表首节点 * @param n 正整数 * @return 删除后链表首节点 */ public ListNode removeNthFromEnd(ListNode head

移除单链表的倒数第N个节点

本小妞迷上赌 提交于 2020-03-14 18:51:54
原题   Given a linked list, remove the nth node from the end of list and return its head.   For example, Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5. 1 2 3 1 2 3    Note:   Given n will always be valid.   Try to do this in one pass. 题目大意   删除单链表的倒数第N个结点,注意:输入的N都是合法,在一次遍历中完成操作。 解题思路   先让一个指针走找到第N个节点,然后再让一个指针指向头结点,然后两具指针一起走,直到前一个指针直到了末尾,后一个指针就是倒数第N+1个结点,删除倒数第N个结点就可以了。 代码实现 链表结点类 public class ListNode { int val; ListNode next; ListNode(int x) { val = x; next = null; } } 1 2 3 4 5 6 7 8 9 1 2 3 4 5 6 7 8 9 算法 实现类 public

leetcode19(删除链表倒数第N个节点)--C语言实现

依然范特西╮ 提交于 2020-03-14 18:08:54
求: 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 解: struct ListNode* removeNthFromEnd( struct ListNode* head, int n){ int nodeCount = 0 ; int i; struct ListNode* p = head; struct ListNode* tmp; while (p!=NULL){ nodeCount++; p=p->next; } p=head; if (n==nodeCount){ tmp = head; head = head->next; free(tmp); } else { for (i= 0 ;i<nodeCount-n- 1 ;i++){ p=p->next; } tmp = p->next; p->next=tmp->next; free(tmp); } return head; } 解: struct ListNode* removeNthFromEnd( struct ListNode* head, int n){ struct ListNode

C语言实现单链表(带头节点)

北城以北 提交于 2020-03-14 14:41:27
C语言在实现单链表存储时需要注意的几点: 1.定义结构体,typedef:用于给结构体另命名 // 定义结构体类型 typedef struct Node{ int data; struct Node *next; }Node,*LinkedList; 2.链表初始化 // 链表初始化 LinkedList LinkedListInit(){ Node *Head,*L,*LNew; // 申请节点空间 Head = (Node *)malloc(sizeof(Node)); // 判断是否有足够内存空间 if(Head == NULL){ printf("申请空间失败\n"); exit(-1); } L = Head; L->next = NULL; for(int i=0;i<3;i++){ // 分配第一个节点 LNew = (Node *)malloc(sizeof(Node)); // 判断是否有足够内存空间 if(LNew == NULL){ printf("申请空间失败\n"); exit(-1); } LNew->data = i; L->next = LNew; LNew->next = NULL; L = LNew; } return Head; } 具体源码demo.c #include <stdio.h> #include <malloc.h>

libevent源码剖析

Deadly 提交于 2020-03-14 14:33:40
安装与使用   libevent安装:下载地址: http://libevent.org/ 解压文件:tar -zxvf libevent- 2.1 .8-stable.tar.gz 解压后进入目录,进行配置,把库安装到/usr目录下: ./configure -- prefix= /usr 编译安装:sudo make,sudo make install   libevent将I/O事件、信号事件、定时事件三种事件进行了同一事件源,将所有的就绪事件,放入到激活链表中;然后对激活链表中的事件,调用事件的回调函数执行事件处理 一、event_base   The event_base lies at the center of Libevent; every application will have one.对应的为Reactor实例,使用 libevent 函数之前需要分配一个或者多个 event_base 结构体。每个event_base 结构体持有一个事件集合,可以检测以 确定哪个事件是激活的(相当于epoll红黑树的树根)。   因为不是所有的安插在event_base的事件在调用fork()之后都可以正常工作,所以,如果在使用fork()或者其他相关系统调用启动一个新的进程之后,要想在子进程中使用base变量,但是又想让该base变量是一个全新的没有安插事件的变量

线性表应用:约瑟夫问题(猴子选大王)(循环链表,数组,递归)

喜你入骨 提交于 2020-03-14 12:41:16
1 描述:一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。 2 如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王? 3 //用循环链表 4 #include<stdio.h> 5 #include<stdlib.h> 6 7 typedef struct node 8 { 9 int data; 10 struct node *next; 11 }node; 12 13 node *create(int n) 14 { 15 node *head; 16 node *p = NULL; 17 head = (node *)malloc(sizeof(node)); 18 p = head; //p为指向当前结点的指针 19 node *s; 20 int i = 1; 21 22 if(n != 0) 23 { 24 while(i <= n) 25 { 26 s = (node *)malloc(sizeof(node)); //临时的结点 27 s->data = i++; //第一个结点的值为1 第二个结点的值为2 先给值i才++ 28 p->next = s; //头结点的指针域指向第一个结点 29 p =

线性表应用:魔术师发牌与拉丁(Latin)方阵(循环链表)

人走茶凉 提交于 2020-03-14 12:40:30
题目描述: 有黑桃1到13,13张牌,成某种顺序,魔术师可以从1开始数 ,数1,背面朝上的13张牌第一张就是1,然后放到桌面上,然后从1开始数,把第一张放在所有牌下面,数到2,翻开,就是2,再放到桌子上,以此此类推 #include<stdio.h> #include<stdlib.h> #define LEN sizeof(LinkList) #define cardNum 13 typedef struct node { int data; struct node *next; }LinkList; LinkList *creatList() { LinkList *head = NULL; LinkList *s,*r; r = head; for(int i=1; i <= cardNum; i++) { s = (LinkList *)malloc(LEN); s->data = 0; if(head == NULL) { head = s; } else { r->next = s; } r = s; } r->next = head; return head; } void MagicCard(LinkList *head) { int i; int countNum = 2; LinkList *p; p = head; p->data = 1; while(1)

C语言实现奇偶链表

这一生的挚爱 提交于 2020-03-14 11:17:53
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。 示例 1: 输入: 1->2->3->4->5->NULL 输出: 1->3->5->2->4->NULL 示例 2: 输入: 2->1->3->5->6->4->7->NULL 输出: 2->3->6->7->1->5->4->NULL 说明: 应当保持奇数节点和偶数节点的相对顺序。 链表的第一个节点视为奇数节点,第二个节点视为偶数节点,以此类推 链接:https://leetcode-cn.com/problems/odd-even-linked-list 思路:把链表分成奇数链表,偶数链表两个链表,然后拼接。注意的是while循环的条件:因为even最后一点指向NULL或者是even->next指向NULL,但是while(条件 && 条件) typedef struct ListNode * PNODE; PNODE oddEvenList(PNODE phead){ if(phead==NULL) { return NULL ; } PNODE odd =phead;//odd表示奇数链表的尾指针,也用作迭代器

数据结构与算法之美——散列表

核能气质少年 提交于 2020-03-14 05:06:11
1.1 散列思想 ​ 将数据以散列函数的方式(键值对)存储 1.2 散列函数 ​ 形如hash(key)的键值对函数叫散列函数,hash(key)是值,key是键。 1.3 散列函数设计的基本要求 散列函数计算值应该是非负整数 如果散列函数的键相等,则函数一定相等 如果键不相等,则值也一定不相等 ​ 但是在真实的情况下第三个条件很难满足,这种不满足的情况叫它 散列冲突 。 1.4 散列冲突的解决办法 ​ 散列冲突有两类解决办法:开放寻址法、链表法。 开放寻址法 ​ 开放寻址法的思想是如果出现了散列冲突,就向后探测空闲位置,将其插入。列举下比较简单的方法,比如: 线性探测法 。 删除操作不能直接将其值赋为null,否则会使寻址法失效,如果一定用的话,可以用个表示来标记要删除的元素,寻址时发现此标识就向后寻找。 ​ 其实,线性探测法有很多的问题,比如:当空闲的位置越来越少的时候,寻找时间越来越久,性能会下降很多,最坏的情况下会达到O(n)。除了线性探测,还有 二次探测 、 双重散列 等方法可以解决。 ​ 不过,不管哪一种方法,空闲位置不多时,性能都会下降很多。一般情况,都会使空闲位置与散列表的长度处于一个健康的比值,这个比值叫 装载因子 。 链表法 ​ 链表法是相比寻址法较好的解决散列冲突的解决办法。他会根据键值的不同来划分不同的‘桶’,每一个桶都会对应一条链表

Python的单向链表实现

﹥>﹥吖頭↗ 提交于 2020-03-13 11:37:51
思路 链表由节点组成,先规定节点(Node),包含data和指向下个节点的next 初始化 data当然就是传入的data了,next指向None 添加 分两种情况: 链表为空,那么头节点和尾节点都指向新插入的节点 链表不为空,那么直接在尾部添加即可 遍历 因为只有链表的尾节点的next是指向None的,所以可以根据这点来从头遍历 删除某个节点 删除的时候分3种情况: 头节点,此时更改head指向的节点就好了 尾节点,此时只需将尾节点的前一个节点(prev)的next指向None即可 中间的节点,此时要将此节点的前一个节点的(prev)的next指向后续节点的(Current.next) 搜寻 遍历查找即可 清空链表 将头节点和尾节点都置为None即可 class Node: def __init__(self,data): self.next = None self.data = data class SinglyLinkedList: def __init__(self): self.head = None #头节点 self.tail = None #尾节点 self.size = 0 #链表长度 def append(self,data): node = Node(data) if self.tail: #如果链表不为空 self.tail.next = node self