链表1-单链表

链表也是一种线性表,但与线性表不同的是,链表的物理存储结构是一堆地址任意的存储单元。也就是说,链表的数据在内存中的物理位置可能相互邻接,也有可能不邻接。

单链表的基本操作如下:

  1 //链表的基本操作
  2 //定义结点类
  3 template <typename Type> class Node{
  4 public:
  5     Type data;
  6     Node<Type> *next;
  7     Node(const Type &_data){
  8         data=_data;
  9         next=NULL;
 10     }
 11
 12 //定义链表类
 13 template <typename Type> class LinkedList{
 14 private:
 15     Node<Type> *head;
 16 public:
 17     //构造
 18     LinkedList(){
 19         head=NULL;
 20     }
 21
 22     //析构
 23     ~LinkedList(){
 24         Node<Type> *current_node=head;
 25         while(current_node!=NULL){
 26             Node<Type> *delete_node=current_node;
 27             current_node=current_node->next;
 28             delete delete_node;
 29         }
 30     }
 31
 32     //插入函数,这里插入的是指针,需要在主函数内先开好内存
 33     void insert(Node<Type> *node, int index){
 34         //special case 1: empty list
 35         if(head==NULL){
 36             if(index!=0){
 37                 return;
 38             }
 39             head=node;
 40             return;
 41         }
 42         //special case 2: insert the head
 43         if(index==0){
 44             node->next=head;
 45             head=node;
 46             return;
 47         }
 48         //general case: first find the node before the target position
 49         Node<Type> *current_node=head;
 50         int count=0;
 51         while(current_node->next!=NULL&&count<index-1){
 52             current_node=current_node->next;
 53             count++;
 54         }
 55         //make sure the index is legal, then insert
 56         if(count==index-1){
 57             node->next=current_node->next;
 58             current_node->next=node;
 59         }
 60     }
 61
 62     //遍历函数
 63     void output(){
 64         if(head==NULL){
 65             return;
 66         }
 67         Node<Type> *current_node=head;
 68         while(current_node!=NULL){
 69             cout<<current_node->data<<" ";
 70             current_node=current_node->next;
 71         }
 72         cout<<endl;
 73     }
 74
 75     //删除函数
 76     void delete_node(int index){
 77         if(head==NULL){
 78             return;
 79         }
 80         Node<Type> *current_node=head;
 81         int count=0;
 82         if(index==0){
 83             head=head->next;
 84             delete current_node;
 85             return;
 86         }
 87         //找目标位置的前一位
 88         while(current_node->next!=NULL&&count<index-1){
 89             current_node=current_node->next;
 90             count++;
 91         }
 92         //注意删除位置不能是最后一位的后一位
 93         if(count==index-1&&current_node->next!=NULL){
 94             Node<Type> *delete_node=current_node->next;
 95             current_node->next=delete_node->next;
 96             delete delete_node;
 97         }
 98     }
 99
100
101     //返回给定值节点的地址
102      Node<Type>* find_node(Type value){
103         Node<Type> *current_node=head;
104         while(current_node!=NULL){
105             if(current_node->data==value){
106                 return current_node;
107             }
108             current_node=current_node->next;
109         }
110         return NULL;
111     }
112
113
114     //反转函数
115     void reverse(){
116         if(head==NULL||head->next==NULL){
117             return;
118         }
119         Node<Type> *next_node,*current_node;
120         current_node=head->next;
121         //拆掉头节点
122         head->next=NULL;
123         //把头节点的下一个节点指向头节点,再将其更新为新的头节点
124         while(current_node!=NULL){
125             next_node=current_node->next;
126             current_node->next=head;
127             head=current_node;
128             current_node=next_node;
129         }
130     }
131 };
132
133
134 int main(){
135     LinkedList<int> linkedlist;
136     for(int i=0;i<5;i++){
137         //调用insert函数,i为插入的值,i-1为插入下标
138         Node<int> *node=new Node<int>(i+1);
139         linkedlist.insert(i,node);
140     }
时间: 2024-12-24 07:28:31

链表1-单链表的相关文章

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

【数据结构-链表】单链表

链表 特点 链表是通过任意的存储单元来存储线性表中的数据元素 链表组成 链表是由很对节点组成 带有头结点的单链表 typedef struct{ struct node *head;//链表的头结点 }LinkList; 节点结构 typedef struct node{ int data; struct node *next; }Node; 链表的插入操作 首先得到插入位置的节点n 得到插入位置的前一个节点pre 讲新插入的节点的next指针指向n pre节点的next指向n /** * 在p

【算法设计-链表】单链表与双向循环链表

1.单链表代码:包含了尾插法,插入,删除操作. 有头结点的单链表也是为了在第一个位置插入和删除时候容易,不需要另外讨论 #include<stdio.h> #include<stdlib.h> typedef struct Linklist { int key; Linklist *next; }Linklist; Linklist* create_end() { Linklist *head=(Linklist *)malloc(sizeof(Linklist)); Linkli

Python与数据结构[0] -&gt; 链表[0] -&gt; 单链表与带表头单链表的 Python 实现

单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利用Python来完成单链表的实现. 1 单链表 不带表头的单链表通常形式如下, node_1 -> node_2 -> node_3 -> node_4 完整代码 1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.v

数据结构:链表(单链表)

一.链表 概念:链表[Linked List]是由一组不必相连(可连续可不连续)的内存结构(节点),按照特定的顺序链接在一起的抽象数据类型: 分类:链表常用的大概有三类:单链表.双向链表.循环链表(这篇文章主要讲单链表) 操作:链表的核心操作主要有三个(查找遍历.插入.删除) 二.单链表 上图就是一个单链表的数据结构了,从上图可以看出,每个节点包含两个重要的元素(data.next),那么什么是单链表呢? 概念:各个内存结构通过一个Next指针链接在一起,每个内存结构都存在后续的内存结构(链尾除

[程序员代码面试指南]链表问题-单链表的选择排序(选择排序)

题意 给定一个无序单链表的头节点head,实现单链表的选择排序. 题解 按选择排序方法:每次从原链表找出最小值,从原链表删除,插入新的有序链表. 时间复杂度O(n^2) 额外空间复杂度O(1) 代码 public class Main { public static void main(String args[]) { Node n1=new Node(2); Node n2=new Node(1); Node n3=new Node(3); n1.next=n2; n2.next=n3; No

双链表与单链表的比较

双链表在一定程度上就是单链表的的基础上加上了一个指针域,在一些情况下能够使程序更加健壮和速率更加高效. 双链表的结点定义 typedef struct node { int data; struct node *next; struct node *prior; }node; 双链表的定义 typedef struct doublelist { node *head; node *tail; size_t size; }doublelist; 链表的初始化 doublelist *list; l

【转】单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我 还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提

链表——将单链表从m到n的结点位置翻转

题目:反转链表从m-n位置的结点 For example: Given1->2->3->4->5->NULL, m = 2 and n = 4, return1->4->3->2->5->NULL. 从第二到第四的结点被反转了. 其中m和n满足条件: 1 ≤ m ≤ n ≤ length of list. 思路: 仍是逆序,仍考虑到用辅助空间stack. 将m-n的结点依次入栈,并标记与入栈结点相邻的前后两个结点pfirst和psecond (若