[leetcode]链表基础回顾

一.创建带头节点的链表

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

typedef struct Node {

char ch;

Node* next;

}*LinkList,ListNode;

void printLinkList(LinkList& head)

{

LinkList p = head->next;

while (p != NULL)

{

cout << p->ch << " ";

p = p->next;

}

}

int main() {

Node* head = new Node;

head->next = nullptr;

Node* p = head;

Node* s = nullptr;

char ch;

cout << "Enter characters to build the list (use '#' to stop): ";

while (cin >> ch && ch != '#') {

s = new Node(); // 创建新节点,初始化 ch 和 next 为 nullptr

s->ch = ch;

s->next = nullptr;

p->next = s;

p = s;

}

printLinkList(head);

return 0;

}

二.遍历单链表

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

typedef struct Node {

char ch;

Node* next;

}*LinkList,ListNode;

void printLinkList(LinkList& head)

{

LinkList p = head->next;

while (p != NULL)

{

cout << p->ch << " ";

p = p->next;

}

}

int main() {

Node* head = new Node;

head->next = nullptr;

Node* p = head;

Node* s = nullptr;

char ch;

cout << "Enter characters to build the list (use '#' to stop): ";

while (cin >> ch && ch != '#') {

s = new Node(); // 创建新节点,初始化 ch 和 next 为 nullptr

s->ch = ch;

s->next = nullptr;

p->next = s;

p = s;

}

printLinkList(head);

return 0;

}

三.添加新节点

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

typedef struct Node {

char ch;

Node* next;

}*LinkList,ListNode;

void printLinkList(LinkList& head)

{

LinkList p = head->next;

while (p != NULL)

{

cout << p->ch << " ";

p = p->next;

}

}

void push_back(LinkList& head, char ch)

{

LinkList newNode = new Node;

newNode->next = NULL;

newNode->ch = ch;

LinkList p = head;

while (p->next != nullptr)

{

p = p->next;

}

p->next = newNode;

}

int main() {

Node* head = new Node;

head->next = nullptr;

Node* p = head;

Node* s = nullptr;

char ch;

cout << "Enter characters to build the list (use '#' to stop): ";

while (cin >> ch && ch != '#') {

s = new Node(); // 创建新节点,初始化 ch 和 next 为 nullptr

s->ch = ch;

s->next = nullptr;

p->next = s;

p = s;

}

push_back(head, '5');

printLinkList(head);

return 0;

}

四.计算链表长度

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

typedef struct Node {

char ch;

Node* next;

}*LinkList,ListNode;

void printLinkList(LinkList& head)

{

LinkList p = head->next;

while (p != NULL)

{

cout << p->ch << " ";

p = p->next;

}

}

void push_back(LinkList& head, char ch)

{

LinkList newNode = new Node;

newNode->next = NULL;

newNode->ch = ch;

LinkList p = head;

while (p->next != nullptr)

{

p = p->next;

}

p->next = newNode;

}

int size(LinkList head)

{

int len = 0;

int size = 0;

ListNode* p = head->next;

while (p != NULL)

{

size++;

p = p->next;

}

return len;

}

int main() {

Node* head = new Node;

head->next = nullptr;

Node* p = head;

Node* s = nullptr;

char ch;

cout << "Enter characters to build the list (use '#' to stop): ";

while (cin >> ch && ch != '#') {

s = new Node(); // 创建新节点,初始化 ch 和 next 为 nullptr

s->ch = ch;

s->next = nullptr;

p->next = s;

p = s;

}

push_back(head, '5');

printLinkList(head);

return 0;

}

五.插入新节点

#include <iostream>

#include <string>

#include <algorithm>

using namespace std;

typedef struct Node {

char ch;

Node* next;

}*LinkList,ListNode;

void printLinkList(LinkList& head)

{

LinkList p = head->next;

while (p != NULL)

{

cout << p->ch << " ";

p = p->next;

}

}

void push_back(LinkList& head, char ch)

{

LinkList newNode = new Node;

newNode->next = NULL;

newNode->ch = ch;

LinkList p = head;

while (p->next != nullptr)

{

p = p->next;

}

p->next = newNode;

}

int size(LinkList head)

{

int len = 0;

int size = 0;

ListNode* p = head->next;

while (p != NULL)

{

size++;

p = p->next;

}

return len;

}

void insert(LinkList& head, int index,char ch)//index从head开始算为0到size

{

int len = size(head);

LinkList p = head->next;

for (int i = 1; i < index - 1; i++)

{

p = p->next;

}

LinkList newNode = new Node;

newNode->ch = ch;

newNode->next = p->next;

p->next = newNode;

}

int main() {

Node* head = new Node;

head->next = nullptr;

Node* p = head;

Node* s = nullptr;

char ch;

cout << "Enter characters to build the list (use '#' to stop): ";

while (cin >> ch && ch != '#') {

s = new Node(); // 创建新节点,初始化 ch 和 next 为 nullptr

s->ch = ch;

s->next = nullptr;

p->next = s;

p = s;

}

push_back(head, '5');

insert(head, 3,'3');

printLinkList(head);

return 0;

}

//1 2 4 #

六.删除节点

复制代码
void deleteList(LinkList& head, int index) {
    if (head == nullptr || head->next == nullptr || index < 0) {
        // 如果链表为空或索引无效,不执行任何操作
        return;
    }

    LinkList p = head; // p 用于遍历链表,从头节点开始
    if (index == 0) {
        // 如果要删除的是头节点的下一个节点
        LinkList temp = head->next; // 保存要删除的节点
        head->next = temp->next;    // 更新头节点的 next 指针,跳过要删除的节点
        delete temp;               // 释放要删除节点的内存
        return;
    }

    // 找到要删除节点的前一个节点
    for (int i = 1; i < index; i++) {
        if (p->next == nullptr) {
            // 如果索引超出链表范围,不执行任何操作
            return;
        }
        p = p->next;
    }

    if (p->next == nullptr) {
        // 如果索引超出链表范围,不执行任何操作
        return;
    }

    LinkList temp = p->next; // 保存要删除的节点
    p->next = temp->next;  // 更新前一个节点的 next 指针,跳过要删除的节点
    delete temp;           // 释放要删除节点的内存
}
相关推荐
Black蜡笔小新2 小时前
自动化AI算法训练服务器DLTM助力医学影像分析进入AI智能分析新时代
人工智能·算法·自动化
手写码匠3 小时前
深入解析大模型架构之争:全能通用模型 vs 领域专精模型
人工智能·深度学习·算法·aigc
浅念-3 小时前
LeetCode 回溯算法题——综合练习
数据结构·c++·算法·leetcode·职场和发展·深度优先·dfs
列星随旋4 小时前
线段树和树状数组的学习
学习·算法
圣保罗的大教堂4 小时前
leetcode 61. 旋转链表 中等
leetcode
全糖可乐气泡水5 小时前
Codex适配国产信创环境安装部署与技术适配全解析
开发语言·git·python·算法·百度
h_a_o777oah6 小时前
状态机+划分型 DP :深度解析K-划分问题下 DP 状态的转移逻辑(洛谷P2679 P2331 附C++代码)
c++·算法·动态规划·acm·状态机dp·划分型dp·滚动数组优化
05候补工程师6 小时前
从算法理想向工程现实的跨越:SLAM 核心架构、思维误区与 Nav2 实战避坑指南
人工智能·算法·安全·架构·机器人
手写码匠7 小时前
Android 17 适配实战指南:新特性解读、隐私变更与迁移全攻略
人工智能·深度学习·算法·aigc