王道P37 T1 : 设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点. 王道上的答案绝对是错的,我自己想了一个 函数主体 LinkList* del_x(LinkList* prior,LinkList* L,int x){ if(L==NULL) return NULL; if(L->data==x){ if(prior==NULL){ LinkList* ans=L->next; delete L; if(ans!=NULL) ans=del_x(NULL,ans,x); /…
/*设计一个递归算法,删除不带头结点的单链表L中所有值为x的结点*/ /* 算法思想:设f(L,x)的功能是删除以L为首结点指针的单链表中所有值等于x的结点, 则显然有f(L->next,x)的功能是删除以L->next为首结点指针的单链表中所有值等于x 的结点.递归模型如下: 终止条件:f(L,x)=不做任何事情 若L为空表 递归主体:f(L,x)=删除*L结点;f(L->next,x); 若L->data == x f(L,x)=f(L->next,x) 其他情况 */…
我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node…
1,本程序实现了线性表的链式存储结构.实现的链表带有两个指针,一个始终指向链表中的第一个结点,另一个指针始终指向链表中的最后一个结点. 之所以设置尾指针,是因为,在插入元素到链表中的末尾时,可以通过尾指针直接找到链表的最后一个元素,从而不需要遍历链表就可以完成插入操作. 2,具体实现链表的类名为LList2.java,它首先实现了线性表的接口ListInterface,该接口的定义见:http://www.cnblogs.com/hapjin/p/4549492.html LList2.java…
本程序采用JAVA语言实现了线性表的链式实现.首先定义了线性表的接口ListInterface,然后LList类实现了ListInterface完成了链表的实现. 本实现中,链表是不带表头结点的,且有一个指针始终指向链表中的第一个元素,并没有定义尾指针.因此,每次向链表中插入新结点时需要遍历链表一次. 更详细的解释参考<数据结构与算法分析 JAVA语言描述第二版>Frank M. Carrano 著 ListInterface接口的定义如下: public interface ListInte…
给定一个排序链表,删除所有重复的元素使得每个元素只留下一个.案例:给定 1->1->2,返回 1->2给定 1->1->2->3->3,返回 1->2->3详见:https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/ Java实现: 递归实现: /** * Definition for singly-linked list. * public class…
#include <iostream> using namespace std; struct Node { Node *next; int elem; }; void creatList(Node* &head) { head = new Node; int elem; cin>>elem; head->elem = elem; Node *p = head; while(cin>>elem&&elem) { Node *q = new…
所实现的循环单链表的结构例如以下图所看到的: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""> 循环单链表的实现,和上一篇文章单链表的实现大致同样点击打开链接,略有差别: 1:循环推断的条件不再是s == NULL或者s->next == NULL,而是他们是否等…
题目描述 输入两个链表,找出它们的第一个公共结点.   class Solution: def FindFirstCommonNode(self, pHead1, pHead2): # write code here lst1 = [] lst2 = [] result = [] if not pHead1 or not pHead2: return None p1 = pHead1 p2 = pHead2 while p1: lst1.append(p1) p1 = p1.next while…
Link.h #ifndef _LINK_0411 #define _LINK_0411 #include <string> #include <iostream> //定义数据类型为整型 typedef int ElementType; //定义结点 struct Node { ElementType data; Node * next; }; //带头结点链表 class Link { public: Link(); ~Link(); //选择排序 void select_so…
1.带头结点的单链表(推荐使用带头结点的单链表)(采用尾插法) 了解单链表中节点的构成 从上图可知,节点包含数据域和指针域,因此,在对节点进行定义时,我们可以如下简单形式地定义: /* 定义链表 */ typedef struct Node{ int data; // 数据域 struct Node *next; // 指针域(后节点) // struct Node *next; // 指针域(前节点),这里暂时不考虑双链表表 }Node, *LinkedList; 尾插法思想 尾插法的思想其实…
我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天我们就来实现一下带头结点链表的头插和尾插. 代码上传至 https://github.com/chenyufeng1991/HeadInsertAndTailInsert_HeadNode . 核心代码例如以下: //创建带头结点的单链表(尾插法) void CreateListTailInsert(Node…
[题目]分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点.[要求]如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1).[题解]从头遍历链表,每移动一次,K--,直至移动到链表尾部,此时k>0,说明k太大,链表不用删除k==0,链表长度即是k, 删除头结点即可k<0,再次重头遍历链表,每移动一次,k++,当k==0时,此时结点为要删除结点的前结点,使其指向下一个结点即可双向链表一样,只不过需要注意前结点就好 #include <i…
转自:http://blog.csdn.net/xlf13872135090/article/details/8857632 Node *head;  //声明头结点   带头结点初始化 void InitList(Node **head){      *head=(Node *)malloc( sizeof(Node));      (*head)->next=NULL; }   带头结点尾插入,统一操作 方式一: void CreatList(Node **head){     Node *…
//链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //定义链表结构体 struct LinkCode{ int num; ]; struct LinkCode * linknext; }; //静态链表 void Linkone(){ struct LinkCode n1, n2, n3, n4, n5; struct LinkC…
不带头结点的单链表,递归法比较简明!(必背!) 单链表的结构: typedef struct node{ int data; struct node *next; }*List,Node; 创建第一种方法:递归的终止条件:e为0 void CreatList(List &T) { int e; cin>>e; ) T=NULL; else { T=(List)malloc(sizeof(Node)); T->data=e; CreatList(T->next); } } 第…
/*一个集合用带头结点的单链表L表示,编写算法删除其值最大的结点.*/ /* 算法思想:使用pre,p,premax,max四个指针,pre和p进行比较,premax和max进行最后的删除操作 通过遍历找到最大的值,后进行删除 */ void Delete_Max(LinkList& L) { LNode *pre = L, *p = L->next; LNode *premax = pre, *max = p; while (p) { if (max->data < p->…
//将ss所指字符串中所有下标为奇数位上的字母转换成大写,若不是字母,则不转换. #include <stdio.h> #include <string.h> void fun ( char *ss ) { while(*ss) { ss++; if (*ss >= 'a'&&*ss <= 'z') { *ss -= ;//转化为小写 } ss++; } } void main( ) { ] ; void NONO ( ); printf( "…
最近在牛客网上练习在线编程,希望自己坚持下去,每天都坚持下去练习,给自己一个沉淀,不多说了 我遇到了一个用java实现单链表的题目,就自己在做题中将单链表完善了一下,希望大家作为参考也熟悉一下,自己 比较喜欢用java语言,所以就使用java实现单链表了. 为了方便,带头结点的单链表更容易操作和使用,即第一个节点不存储值,可以存储一些标记等 一.创建单链表结构ListNode /** * @ProjectName: JavaPractice * @Package: com.itwang.swor…
File name:no_head_link.c Author:SimonKly Version:0.1 Date: 2017.5.20 Description:不带头节点的单链表 Funcion List: *****************************************************/ #include <stdio.h> #include <stdlib.h> typedef struct node { int id; struct node *…
彻底理解链表中为何使用二级指针或者一级指针的引用 数据结构之链表-链表实现及常用操作(C++篇) C语言实现单链表,主要功能为空链表创建,链表初始化(头插法),链表元素读取,按位置插入,(有序链表)按值插入,按位置删除,按值删除,清空链表,销毁链表. 关键思路:(1)将结点创建结构体:(2)链表中添加头结点,以便统一操作:(3)使用结点一级指针和二级指针的异同点:(4)链表的最小操作单位是结点:(5)操作的起始位置是头结点还是第一个结点,及起始索引是0还是1. #include <stdio.h…
1,不带头结点的单链表操作中,除了InitList(),GetElem(),ListInsert(),ListDelete()操作与带头结点的单链表有差别外,其它的操作基本上一样. 2,不带头结点单链表示意图: 链表指针直接指向了首元节点,因此在首元节点前插入数据元素或者删除首元节点元素都会改变头指针的值. 3,不带头结点的单链表定义及操作集合,除了插入,删除,清空操作需要传递头指针的地址外,基本上一样.头文件defs.h 1 #ifndef _DEFS_H_ 2 #define _DEFS_H…
可能是顺序表研究的细致了一点,单链表操作一下子就实现了.这里先实现带头结点的单链表操作. 大概有以下知识点. 1;结点:结点就是单链表中研究的数据元素,结点中存储数据的部分称为数据域,存储直接后继地址的部分称为指针域. 2;结点示意图: 3;头指针:头指针始终指向链表第一个元素,当有头结点时头结点就是链表第一个元素.头指针具有标识左右,故头指针命名为链表的名字,这里为linklist.头指针是一定存在的. 4;头结点:引入头结点的目的是,将链表首元结点的插入和删除操作与其他结点的插入和删除操作统…
题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 代码如下:未进行优化 public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } public class Solution { //将所有重复的结…
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一, 示例: 第一种情况: 链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可: 第二种情况: 链表走到结尾时,如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.…
本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *getodd( struct ListNode **L ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表.当读到−1时表示输入结束,函数应返回指向单链表头结…
题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头走到尾,每移动一步,就让K值减一,当链表走到结尾时,如果K值大于0,说明不用调整链表,因为链表根本没有倒数第K个节点,此时将原链表直接返回即可:如果K值等于0,说明链表倒数第K个节点就是头结点,此时直接返回head.next,相当于删除了头结点.当K的值小于零时,再次从头结点开始走,每移动一步,就让…
给定一个有序的链表,删除所有有重复数字的节点,只保留原始列表中唯一的数字.例如:给定 1->2->3->3->4->4->5 ,则返回 1->2->5给定 1->1->1->2->3 ,则返回 2->3详见:https://leetcode.com/problems/remove-duplicates-from-sorted-list-ii/description/ Java实现: 递归实现: /** * Definition…
1 题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针. 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 2 思路和方法 (1)链表为空,return NULL: (2)头结点存在重复(22345),删除头结点,另选新的结点作为头结点.处理这种特殊情况,多申请一个指针就可以了. 3 C++核心代码 /* struct ListNode { int val; struct Lis…
1 # 创建一个节点类 2 class Node: 3 def __init__(self, item): 4 self.item = item 5 self.next = None 6 7 8 # 创建一个单链表类 9 class SingleLink: 10 def __init__(self): 11 self.header = None # 初始化单链表的头结点 12 self.length = 0 # length:单链表的长度 13 14 # 判断单链表是否为空 15 def is_…