[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;           // 释放要删除节点的内存
}
相关推荐
嘉陵妹妹43 分钟前
深度优先算法学习
学习·算法·深度优先
GalaxyPokemon1 小时前
LeetCode - 53. 最大子数组和
算法·leetcode·职场和发展
小猫咪怎么会有坏心思呢1 小时前
华为OD机考 - 水仙花数 Ⅰ(2025B卷 100分)
数据结构·链表·华为od
hn小菜鸡2 小时前
LeetCode 1356.根据数字二进制下1的数目排序
数据结构·算法·leetcode
zhuiQiuMX2 小时前
分享今天做的力扣SQL题
sql·算法·leetcode
music&movie3 小时前
算法工程师认知水平要求总结
人工智能·算法
laocui14 小时前
Σ∆ 数字滤波
人工智能·算法
yzx9910134 小时前
Linux 系统中的算法技巧与性能优化
linux·算法·性能优化
全栈凯哥5 小时前
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
java·算法·leetcode·链表
全栈凯哥5 小时前
Java详解LeetCode 热题 100(27):LeetCode 21. 合并两个有序链表(Merge Two Sorted Lists)详解
java·算法·leetcode·链表