[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;           // 释放要删除节点的内存
}
相关推荐
web_1553427465628 分钟前
性能巅峰对决:Rust vs C++ —— 速度、安全与权衡的艺术
c++·算法·rust
计算机小白一个7 小时前
蓝桥杯 Java B 组之设计 LRU 缓存
java·算法·蓝桥杯
万事可爱^8 小时前
HDBSCAN:密度自适应的层次聚类算法解析与实践
算法·机器学习·数据挖掘·聚类·hdbscan
大数据追光猿10 小时前
Python应用算法之贪心算法理解和实践
大数据·开发语言·人工智能·python·深度学习·算法·贪心算法
Dream it possible!10 小时前
LeetCode 热题 100_在排序数组中查找元素的第一个和最后一个位置(65_34_中等_C++)(二分查找)(一次二分查找+挨个搜索;两次二分查找)
c++·算法·leetcode
夏末秋也凉10 小时前
力扣-回溯-46 全排列
数据结构·算法·leetcode
南宫生10 小时前
力扣每日一题【算法学习day.132】
java·学习·算法·leetcode
柠石榴10 小时前
【练习】【回溯No.1】力扣 77. 组合
c++·算法·leetcode·回溯
Leuanghing10 小时前
【Leetcode】11. 盛最多水的容器
python·算法·leetcode
qy发大财10 小时前
加油站(力扣134)
算法·leetcode·职场和发展