链表的基本操作,删除插入。

lass Node {
int val; // data | element
Node next; // 如果 next == null 表示是最后一个结点

Node(int val) {
this.val = val;
this.next = null;
}

public String toString() {
return String.format("Node(%d)", val);
}
}

public class MyLinkedList {
public static void main(String[] args) {
Node head = null;
// head 的意思是链表的第一个结点
// 通过第一个结点,就可以找到完整的链表的所有结点
// 所以,链表的第一个结点往往代表整个链表

// 空的链表,就是一个结点都没有的链表
// 也就没有第一个结点
// head == null 表示第一个结点不存在
// 也就是整个链表为空

// 头插
/*
int val = 0;
// 1. 结点
Node node = new Node(val);
// 2. 让原来的 head 成为 node 的下一个结点
node.next = head;
// 3. 更新第一个结点的引用
head = node;

pushFront(head, 0);
*/

head = pushFront(head, 0);
head = pushFront(head, 1);
head = pushFront(head, 2);

// 打印
print(head); // 2 1 0

// 尾插
head = popFront(head);
print(head); // 1 0

head = pushBack(head, 10);
head = pushBack(head, 20);
head = pushBack(head, 30);
print(head); // 1 0 10 20 30
head = popBack(head);
head = popBack(head);
head = popBack(head);
head = popBack(head);
head = popBack(head);

head = popBack(head); // 报错
print(head); // 空

head = pushBack(head, 100);
print(head); // 100
}

// 打印
private static void print(Node head) {
System.out.println("打印链表:");
for (Node cur = head; cur != null; cur = cur.next) {
System.out.print(cur + " --> ");
}
System.out.println("null");
}

// 头插
// head: 原来的第一个结点
// val:要插入的值
// 返回:新的第一个结点
private static Node pushFront(Node head, int val) {
// 1. 结点
Node node = new Node(val);
// 2. 让原来的 head 成为 node 的下一个结点
node.next = head;
// 3. 更新第一个结点的引用
return node;
}

private static Node pushBack(Node head, int val) {
Node node = new Node(val);
if (head == null) {//可以在null前插,不能再null后插,这个判头结点null
return node;
} else {
Node last = head;
while (last.next != null) {
last = last.next;
}
last.next = node;

return head;
}
}

private static Node popFront(Node head) {
if (head == null) {
System.err.println("空链表无法删除");
return null;
}

// 原来第一个结点,会因为没有引用指向而被回收
return head.next;
}

private static Node popBack(Node head) {
if (head == null) {//只要删除都要判null
System.err.println("空链表无法删除");
return null;
}

if (head.next == null) {//尾删判断只有一个,
return null;
} else {
Node lastSecond = head;//删除最后一个,先找到倒数第二个,让倒数第二个的下一个为null
while (lastSecond.next.next != null) {
lastSecond = lastSecond.next;
}

lastSecond.next = null;
return head;
}
}
}

原文地址:https://blog.51cto.com/14232658/2443369

时间: 2024-10-29 02:23:44

链表的基本操作,删除插入。的相关文章

线性链表的基本操作(删除,插入等)

主要内容如题,由于感觉自己对链表这块的知识真的很薄弱. 我之前还时不时的去看链表相关的知识,也算是复习把,但是效果不尽人意. 时间可以淡忘一切,有的很慢,有的很快,而我感觉自己对链表的学习则是一瞬的时间. 哈哈,当然也没有这么夸张啦. 还是觉着把单链表的基本操作自己再撸一遍,这个感觉很有必要. 果然在编写的过程中发现很多问题,不过好在有些不太好理解的部分后面在草稿纸上画了一下才顺利编写出对应的代码.   我把代码贴上来也方便失忆后的恢复对链表的记忆.我估计后面自己看代码都有可能看不太明白.  

数据结构:链表的基本操作(创建,删除,插入,逆序,摧毁)

代码注释比较详细: #include <iostream> #include <cstdlib> using namespace std; struct Node{ int data; Node* next; }; Node* head = NULL; bool create() { head = (Node*)malloc(sizeof(Node)); if(NULL == head) return false; head->data = 0; head->next

链表的创建,插入,删除,输出基本操作

#include<stdio.h>#include<cstdlib> struct student  //定义一个学生结点,结点包括值域和指针域{ int num;//学号 char name[20];//姓名 char address[20];//地址 struct student *next;//定义结点的指针域,指向下一个结点};typedef struct student LIST;LIST *CreateList();LIST *InsertNode(LIST *h,LI

头插法链表的基本操作:创建空链表,插入结点,遍历链表,求链表长度,查找结点,删除结点

1 #include <stdio.h> 2 #include <stdlib.h> 3 /* 4 头插法链表的基本操作:创建空链表,插入节点,遍历输出节点数据,求链表长度,查找结点,删除结点. 5 */ 6 typedef struct node 7 { 8 int data; 9 struct node * next; 10 }NODE; 11 //创建空链表 12 NODE * createList() 13 { 14 NODE * head = (NODE *)malloc

链表的基本操作:创建、插入、删除

#include<iostream> using namespace std; //链表的定义 struct ListNode { int val; ListNode* next; ListNode(int n) :val(n), next(nullptr) {} }; //链表的打印 void printList(ListNode* head) { ListNode* pT = head; while (pT != nullptr) { cout << pT->val &l

链表(二)——单向链表的基本操作(创建、删除、打印、结点个数统计)

1.指针的联动 通过两个指针分别指向前驱和后继结点,并在单向链表上进行移动,当指针指向待处理的结点时,该结点的前驱也有指针指向. 2.设有一个无序单向链表,且数据域的值均不相同,使指针pmin指向最小值结点,并使指针prem指向最小值结点的前驱结点: 代码片段: for(p = head; p; q = p, p = p->next) { if(pmin->data > p->data) { pmin = p; prem = q; } } 3.单向链表的删除算法 注:使用mallo

单链表的读取、插入与删除

链表是由一个个结点构成,而每一个结点都是由存储数据的数据域以及存储下一个结点地址的地址域两部分构成. 链表的一大优点就是,可以在任意两个数之间毫无限制的插入无限多的数据.在很多时候,我们都需要对数据做个查找工作,就比如,一个班的同学去上课,结果老师发现人数不对,于是就开始点名,点到后来发现某某某同学没有到,这就是典型的数据查找.那么如何实现对链表的数据元素的查找呢? 比如,我想知道链表的第5个元素的值是多少,我应该怎么做呢?由于,链表是依靠地址来查找数据的,那比如说链表的第一个结点的数据域中保存

单链表(建立、插入、删除、打印)

单向链表创建 链表是动态分配存储空间的链式存储结构. 其包括一个"头指针"变量,其中第0个结点称为整个链表的头结点,头结点中存放一个地址,该地址指向一个元素,头结点一般不存放具体数据,只是存放第一个结点的地址. 链表中每一个元素称为"结点",每个结点都由两部分组成:存放数据元素的数据域和存储直接后继存储位置的指针域.指针域中存储的即是链表的下一个结点存储位置,是一个指针.多个结点链接成一个链表. 最后一个结点的指针域设置为空(NULL),作为链表的结束标志,表示它没

单链表的建立,插入,显示,查找删除以及反转

#include "stdafx.h" #include <iostream> #include <string> #include <stack> //二叉树遍历时使用栈 #include <queue> //二叉树层次遍历时使用 using namespace std; //单链表操作 class Node { public: Node *next; Node *front; //双向链表时指向前驱节点的指针 int data; };

单链表的使用(插入,查找,删除,链表的倒置,删除相同结点)

typedef struct node//该结构体代表一个结点{ int data; //结点的数据域 struct node *next; //结点的指针域}lnode,*linklist; //定义一个结构体变量和指向结构体的指针//用头插法创建一个链表linklist create_begin(){ linklist head=(linklist)malloc(sizeof(lnode));//定义头结点并开辟空间 head->next=NULL; //为避免指针乱指,将头结点下一个指针赋