链表操作(创建空链表、插入表头、插入表尾、反转链表、修改、删除链表元素、获取链表元素的位置)
最编程
2024-06-11 11:44:51
...
1 #include<iostream>
2 #include<string>
3 #include<vector>
4 #include<list>
5 #include<stack>
6 using namespace std;
7
8 struct ListNode {
9 int val;
10 ListNode *next;
11 ListNode(int x) : val(x), next(nullptr) {}
12 };
13
14
15 class Solution {
16 public:
17 void reverseNode(ListNode *&head) {
18 ListNode *newNode = nullptr;
19 while (head != nullptr) {
20 ListNode *tmpNode = head->next;
21 head->next = newNode;
22 newNode = head;
23 head = tmpNode;
24 }
25 head = newNode;
26 }
27
28 void insertNodeAtHead(ListNode *&head, int val) {
29 ListNode *newNode = new ListNode(val);
30 newNode->next = head;
31 head = newNode;
32 }
33
34 void insertNodeAtTail(ListNode *&head , int val) {
35 ListNode *newNode = new ListNode(val);
36 newNode->next = nullptr;
37 ListNode *cur = head;
38 if (cur == nullptr) {
39 head = newNode;
40 return;
41 }
42 while (cur->next != nullptr) {
43 cur = cur->next;
44 }
45 cur->next = newNode;
46 }
47
48 void printfListNode(ListNode *head) {
49 while (head != nullptr)
50 {
51 printf("%d ", head->val);
52 head = head->next;
53 }
54 printf("\n");
55 }
56
57 void modHeadVal(ListNode *&head, int val1, int val2) {
58 ListNode *cur = head;
59 while (cur->next != nullptr) {
60 if (cur->next->val == val1) {
61 cur->next->val = val2;
62 }
63 cur = cur->next;
64 }
65 }
66
67 void deleteNode(ListNode *&head, int val) {
68 if (head == nullptr) {
69 return;
70 }
71 ListNode *cur = head;
72 while(cur->next != nullptr) {
73 if (cur->next->val == val) {
74 cur->next = cur->next->next;
75 } else {
76 cur = cur->next;
77 }
78 }
79 }
80 void getValIndexList(ListNode *head, int val, vector<int> &indexList) {
81 ListNode *cur = head;
82 int count = 0;
83 while (cur->next != nullptr) {
84 if (cur->val == val) {
85 indexList.push_back(count);
86 }
87 cur = cur->next;
88 count++;
89 }
90 if (cur->val == val) {
91 indexList.push_back(count);
92 }
93 }
94 };
95
96
97 int main()
98 {
99 Solution *s1 = new (Solution);
100 ListNode *head = nullptr;
101 vector<int> vec = {1, 2, 3, 4, 5, 6};
102 for (const auto &val : vec) {
103 s1->insertNodeAtHead(head, val);
104 }
105 s1->printfListNode(head); // 6 5 4 3 2 1
106 s1->insertNodeAtTail(head, 7);
107 s1->printfListNode(head); // 6 5 4 3 2 1 7
108
109 s1->reverseNode(head);
110 s1->printfListNode(head); // 7 1 2 3 4 5 6
111 s1->deleteNode(head, 5);
112 s1->printfListNode(head); // 7 1 2 3 4 6
113 s1->modHeadVal(head, 3, 33);
114 s1->printfListNode(head); // 7 1 2 33 4 6
115 vector<int> vec1;
116 s1->getValIndexList(head, 4, vec1);
117 for (const auto &val : vec1) {
118 printf("%d ", val); // 4
119 }
120 printf("\n");
121 delete s1;
122 return 0;
123 }
上一篇: 单链表(头部插入和尾部插入)
下一篇: 链表的表头插入和表尾插入
推荐阅读
-
数据结构:图解单个链表的各种操作(插入表头、插入表尾、插入任意位置、删除节点、查询节点、查找链表长度、清空链表)
-
数据结构:双向链表各种操作的图解(表头插入、表尾插入、任意位置插入、查询节点、删除节点、查找链表长度......)。...)
-
数据结构:双向链表各种操作的图解(表头插入、表尾插入、任意位置插入、查询节点、删除节点、查找链表长度......)。...)
-
无头节点单链表的基本操作(插入表头、插入表尾、删除) ---- 带完整代码-2 删除元素
-
链表操作(创建空链表、插入表头、插入表尾、反转链表、修改、删除链表元素、获取链表元素的位置)
-
[数据结构] II.线性表3.双链表的定义及其基本操作(初始化、表头插入、表尾插入、插入、遍历搜索、删除、作废等)