个人网站可以做企业宣传,ps是一款网页制作软件,m导航网站如何做淘宝客,h5 小程序卡码网语言基础课 #xff5c;链表的基础操作III 链表的插入操作链表的删除操作打印链表代码编写 链表的插入操作
找到要插入的位置的前一个位置#xff0c;将其命名为cur#xff0c;将要插入的位置的下一个节点命名为tmp#xff0c;他们之间的关系是cur - next tmp创… 卡码网语言基础课 链表的基础操作III 链表的插入操作链表的删除操作打印链表代码编写 链表的插入操作
找到要插入的位置的前一个位置将其命名为cur将要插入的位置的下一个节点命名为tmp他们之间的关系是cur - next tmp创建一个链表newNode将cur的next指针指向newNode即cur - next nowNode将newNode的next指针指向tmp即newNode - next tmp
转换为代码如下
// 创建了一个新的 ListNode 结构的节点值为x, 并将其地址赋给指针 newNode
ListNode *newNode new ListNode(x);
// 创建了一个名为 tmp 的指针临时存储当前节点 cur 的下一个节点的地址。
ListNode *tmp cur - next;
// 将当前节点 cur 的 next 指针更新为指向新节点 newNode将新节点插入到当前节点后面。
cur - next newNode;
// 将新节点 newNode 的 next 指针设置为指向之前临时存储的节点 tmp
newNode - nxet tmp链表的删除操作
找到删除节点的前一个节点cur并将其next指针设置为指向当前节点的下下个节点。
转换为代码如下
cur - next cur - next - next;打印链表
在函数内部定义一个指针cur初始时指向链表的头节点head
当cur的的下一个节点不存在时cur - next NULL说明下一个节点为空节点即链表的末尾
while (cur - next ! NULL) {
}在循环体内打印当前节点cur的下一个节点cur - next的值val。随后将cur更新为指向链表的下一个节点以便在下一次循环中打印下一个节点的值。
while (cur - next ! NULL) {cout cur - next - val ;cur cur - next;
}循环体结束时表示已经遍历完了整个链表。最后打印一个换行符用于分隔不同的输出行。
void printfLinkList(ListNode *head) {ListNode *cur head;while (cur - next ! NULL) {cout cur - next - val ;cur cur - next;}cout endl;
}代码编写
代码的基础结构以及定义链表的结构体如下
#include iostream
using namespace std;struct ListNode {int val;ListNode *next;ListNode(int x) : val(x), next(nullptr) {}
};int main() {}首先需要接收整数 k 表示需要构建链表的长度
int main () {int k, val;cin k;
}然后我们需要构建一个长度为 k 的链表同时记得创建虚拟头节点以及初始化一个指针cur指向它方便后续节点的接入
ListNode *dummyHead new ListNode(0);
ListNode *cur dummyHead;
for (int i 0; i k; i){cin val;ListNode *newNode new ListNode(val);cur - next newNode;cur cur - next;
}之后需要接收一个整数s表示s行输入每行两个整数第一个整数为 n第二个整数为x代表在链表的第n个位置插入x。
int s, n, x;
cin s;
while (s--) {cin n x;
}当插入的位置n是一个小于等于0的数或者n大于链表的长度时插入位置不合法。 需要注意在插入后链表的长度会变化所以我们需要提前定义一个变量listLen指代链表的长度 int listen k;if (n 0 || n listLen) {cout Insertion position is invalid endl;continue;
}如果不满足上面的条件说明插入的位置合法后续执行的操作是完成插入以及打印链表。
插入链表节点只需要找到插入位置的前一个节点即可也就是第n - 1个节点从虚拟头节点开始遍历需要走n - 1步。
cur dummyHead;
for (int i 1; i listLen; i) {cur cur - next;
}插入链表后需要将链表的长度 1
// 插入节点
ListNode *newNode new ListNode(x); // 构造一个新的节点
ListNode *tmp cur - next;
cur - next newNode;
newNode - next tmp;// 链表长度加1
listLen;随后打印链表即可
printLinkList(dummyHead);链表节点删除的前置步骤类型需要接收一个整数L表示后续会有L行输入每行一个整数m代表删除链表中的第 m 个元素
int l, m;
cin l;
while (l--) {cin m;
}判断是否是非法输入
if (m 0 || m listLen) [cout Deletion position is invalid. endl;continue;
]找到要删除节点的前一个节点
cur dummyHead;
for (int i 1; i m; i) cur cur - next;
cur - next cur - next - next;
listLen--;
if (listLen ! 0) printLinklist(dummyHead);完整代码如下
#include iostream
using namespace std;struct ListNode {int val;ListNode* next;ListNode(int x) : val(x), next(nullptr) {}
};// 打印链表
void printLinklist(ListNode* dummyHead) {ListNode* cur dummyHead;while (cur-next ! NULL) {cout cur-next-val ;cur cur - next;}cout endl;
}
int main() {int k, val;ListNode* dummyHead new ListNode(0); // 创建了一个虚拟头结点cin k;int listLen k; //记录链表长度用来控制非法输入输出// 定义一个指向当前节点的指针 cur初始指向虚拟头结点ListNode* cur dummyHead; for (int i 0; i k; i) { // 或者使用while(n--)cin val;ListNode* newNode new ListNode(val); // 构造一个新的节点cur - next newNode; // 将新节点接入链表cur cur - next; // cur 指向下一个节点}// 增加节点int s, n, x;cin s;while (s--) {cin n x;if (n 0 || n listLen) { // 当要插入的位置非法时cout Insertion position is invalid. endl;continue;}// 指针重新指向虚拟头结点准备用cur遍历链表cur dummyHead;// 寻找添加节点的位置i从1开始因为节点计数从1开始for (int i 1; i n; i) cur cur-next;// 插入节点ListNode* newNode new ListNode(x); // 构造一个新的节点ListNode* tmp cur -next;cur-next newNode;newNode-next tmp;// 链表长度加1listLen;// 打印链表printLinklist(dummyHead);}// 删除节点int l,m;cin l;while (l--) {cin m;if (m 0 || m listLen) {cout Deletion position is invalid. endl;continue;}// 指针重新指向虚拟头结点准备用cur遍历链表cur dummyHead;//开始寻找删除节点的位置i从1开始因为节点计数从1开始for (int i 1; i m; i) cur cur-next;// 删除节点cur-next cur-next-next;listLen--; // 链表长度减一// 如果删除节点后链表为空则不打印if (listLen ! 0) printLinklist(dummyHead);}
}