单链表

快速找到未知长度单链表的中间节点

倾然丶 夕夏残阳落幕 提交于 2020-02-22 14:31:43
在讨论之前,我们首先首先要明白,什么是单链表? 单链表:链接方式存储的线性表 单链表的结点结构 ┌──┬──┐ │data│next│ └──┴──┘  data域--存放结点值的数据域  next域--存放结点的直接后继的地址(位置)的指针域(链域) 注意:   ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。  ②每个结点只有一个链域的链表称为单链表(Single Linked List)。 那么我们先用java设计一下我们的单链表 public class MyLinkedList<E> { Node<E> first; Node<E> last; public MyLinkedList() { super(); } public void add(E e) { if (first == null) { first = new Node<E>(e, null); } else { if (last == null) { last = new Node<E>(e, null); first.next = last;// 因为first和last还没建立关系,所以在这里要将他们的关系建立起来 } else { Node<E> n = new Node<>(e, null);// 一个临时的引用n last.next = n;//

单链表的实现-Java

余生颓废 提交于 2020-02-17 09:01:39
建立结点类 /** * @author cnkeysky * @date 2020-02-15 22:31 */ public class Node < T > { protected T data ; protected Node < T > next ; public Node ( ) { } public Node ( T data ) { this . data = data ; this . next = null ; } @Override public String toString ( ) { return this . data + "" ; } } 单链表 import java . util . Stack ; /** * @author cnkeysky * @date 2020-02-15 22:33 */ public class SingleLinkedList < T > { protected Node < T > header ; protected Node < T > rear ; private int count ; public SingleLinkedList ( ) { header = new Node < > ( ) ; rear = header ; } /** * 拷贝构造 * * @param list

PTA|《C语言程序设计(第3版)》习题11-8 单链表结点删除 (20分)

孤人 提交于 2020-02-09 20:27:04
题目 本题要求实现两个函数,分别将读入的数据存储为单链表、将链表中所有存储了某给定值的结点删除。链表结点定义如下: struct ListNode { int data ; ListNode * next ; } ; 函数接口定义: struct ListNode * readlist ( ) ; struct ListNode * deletem ( struct ListNode * L , int m ) ; 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表。当读到−1时表示输入结束,函数应返回指向单链表头结点的指针。 函数deletem将单链表L中所有存储了m的结点删除。返回指向结果链表头结点的指针。 裁判测试程序样例: # include <stdio.h> # include <stdlib.h> struct ListNode { int data ; struct ListNode * next ; } ; struct ListNode * readlist ( ) ; struct ListNode * deletem ( struct ListNode * L , int m ) ; void printlist ( struct ListNode * L ) { struct ListNode * p = L ; while ( p )

数据结构 C++ 单链表 一元多项式的相加

半腔热情 提交于 2020-02-08 05:10:50
#include <iostream> using namespace std; struct Node { double coe; //系数 int exp; //指数 Node *next; }; void CreatPoly(Node *&head, int n) // 生成带表头结点的单链表,除头结点外另生成n个结点 { head = (Node *)new Node; head->coe = 0; head->exp = 0; head->next = NULL; // 初始化头结点 cout << "分别每行输入各项系数及指数:" << endl; Node *p = head; for(int i = 0; i < n; i++) { p->next = (Node *)new Node; // 生成新结点,尾插入生成链表 p = p->next; cin >> p->coe >> p->exp; p->next = NULL; } } void ShowPoly(Node *&head) { if(head->next == NULL) // 结果是0时直接输出0 putchar('0'); else { for(Node *p = head->next; p != NULL; p = p->next) { if(p != head->next && p->coe

6-8 求单链表元素序号 (10分)

a 夏天 提交于 2020-02-07 06:03:47
本题要求实现一个函数,求带头结点的单链表中元素序号。 函数接口定义: int Locate ( LinkList L, ElemType e); L是带头结点的单链表的头指针,e是要查找的元素值。如果e在单链表中存在,函数Locate返回其序号(序号从1开始);否则,返回0。 裁判测试程序样例: #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; LinkList Create();/* 细节在此不表 */ int Locate ( LinkList L, ElemType e); int main() { ElemType e; LinkList L = Create(); scanf("%d",&e); printf("%d\n", Locate(L,e)); return 0; } /* 你的代码将被嵌在这里 */ 输入样例: 2 1 4 5 3 -1 5 输出样例: 4 分析: 一开始有一个1分的点一直卡着不过 后来发现是思路和人家想的不一样,别人的代码是先判断是不是一样再往下走,如果不一样才继续找,而我的代码是不管三七二十一一直找,找得到才停下

循环单链表(代码完整)

我只是一个虾纸丫 提交于 2020-02-01 10:32:31
头文件: #include <iostream> #include <cstring> using namespace std; struct Node { int data; Node *next; }; class CCircleList { public: CCircleList(); //创建一个头结点,next 指向自己 virtual ~CCircleList(); void CreateCircleList(int a[], int n); //有参析构函数,建立只有头结点的空链表 int Length(); //求单链表的长度 int Get(int i); //按位查找,在单链表中查找第I个结点的元素值 int Locate(int x); //按值查找,在单链表中查找值x的元素序号 void Insert(int n, int x); //插入操作,在第I个位置插入元素值为x的结点 void Delete(int n); //删除查找,在单链表中删除第I个结点 void Modify(int i, int x); //修改操作,修改第I个 void PrintList(); //遍历操作,按序号依次输出元素 private: Node *first; //单链表的头指针 int length; //长度 }; cpp文件 #include "CircleList

写给自己看的单链表(4):快速排序

大憨熊 提交于 2020-01-29 03:04:51
搬运自我的CSDN https://blog.csdn.net/u013213111/article/details/88670136 !!!Attention:以下操作中的单链表均带有头结点!!! 参考了这三篇文章: 单链表快速排序算法的实现 单链表的快速排序 单链表的快排实现 快速排序的思路是:首先,选取一个pivot;然后以pivot作为基准,对待排序的数据进行分区,得到两个部分,一个部分的数据均小于pivot,另一个部分的数据均大于pivot,然后对这两个部分再进行之前的操作,直至排序完成。 对数组来说,pivot通常会选取位于中间的数据,然后用两个指针分别从头、尾两端向中间移动。 但是对于单链表来说,由于只能从头到尾单方向进行移动,所以其快速排序的实现方式有所不同,取第一个节点为pivot(这里要注意开区间和闭区间的问题,下面细说),指针p从pivot开始向后移动,指针q从pivot->next开始向后移动,最后一步是交换pivot和p的值,最终呈现的结果是:从头结点至p-1(含p-1)之间的数据均小于pivot,从p+1(含p+1)至q之间的值均大于pivot。 用一个例子来看看Partition函数的思路: 下面看一下不同区间表达式下的代码,开区间和闭区间导致代码不同的思路来自于这篇文章: 你常写的二分查找,真的是没有bug吗? 1.左闭右开 ,初始区间为 [head

单链表逆转

ぐ巨炮叔叔 提交于 2020-01-28 21:13:59
单链表逆转算法 题目为输入一个链表头,反转链表后,输出新表头 例如: 输入:1->2->3->4->5 输入:5->4->3->2->1 首先贴代码,后面再画图讲解 node* reverseList(node* root) { node* p = NULL; node* q; while (root) { q = root->next; root->next = p; p = root; root = q; } return p; } 乍一看可能有点懵逼 首先定义两个指针p,q; q始终保存着原链表的next。 顺序摘下链表的第一个结点当作p的第一个结点,循环往复即可实现链表逆转。 如图第一步 第二步(图画的比较丑) 一直到最后一个结点,p就是逆转过后的链表了 还不明白的可以对着代码多看看,最好自己画一遍图,熟悉了就会了。 来源: CSDN 作者: 胖胖不喝酒 链接: https://blog.csdn.net/xxxx00999/article/details/104100716

6-6 求单链表结点的阶乘和【PAT】

做~自己de王妃 提交于 2020-01-24 07:09:00
题目:   要求实现一个函数,求单链表L结点的阶乘和。这里默认所有结点的值非负,且题目保证结果在int范围内。 函数接口定义: int FactorialSum( List L );   其中单链表List的定义如下: typedef struct Node * PtrToNode ; struct Node { int Data ; /* 存储结点数据 */ PtrToNode Next ; /* 指向下一个结点的指针 */ }; typedef PtrToNode List; /* 定义单链表类型 */ 裁判测试程序样例: # include <stdio.h> # include <stdlib.h> typedef struct Node * PtrToNode ; struct Node { int Data ; /* 存储结点数据 */ PtrToNode Next ; /* 指向下一个结点的指针 */ } ; typedef PtrToNode List ; /* 定义单链表类型 */ int FactorialSum ( List L ) ; int main ( ) { int N , i ; List L , p ; scanf ( "%d" , & N ) ; L = NULL ; for ( i = 0 ; i < N ; i ++ ) { p = (

数据结构篇————线性表

谁说我不能喝 提交于 2020-01-22 15:22:37
数据结构篇————线性表 线性表的抽象数据类型的定义: ADT 线性表(List) Data 线性表的数据对象集合为{a1,a2,....,an},每个元素的类型均为DataType。其中,除了第一个元素a1外,每一个元素有且只有一个直接前驱元素,除最后一个元素an外,每一个元素有且只有一个直接后继元素。数据元素之间的关系是一对一的关系。 Operation InitList(*L):初始化操作,建立一个空的线性表。 ListEmpty(L):若线性表为空,返回true,否则返回false。 ClearList(*L):线性表清空。 GetElem(L,i,*e):将线性表L中第i个位置元素返回给e。 LocateElem(L,e):在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中的序列号;否则,返回0表示失败。 ListInsert(*L,i,e):在线性表的第i个位置插入元素e。 ListDelete(*L,i,*e):删除线性表L中的第i个元素,并用e返回其值 ListLength(L):返回线性表L的元素个数。 PrintList(L):打印线性表 对于不同的应用,线性表的基本操作是不同的,上述操作是最基本的。 对于实际问题中涉及的关于线性表的更复杂操作,完全可以用这些基本操作的组合来实现。 线性表顺序存储 顺序表,一般使用数组实现