提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一、如何造个单链表?
1. 链表由一个又一个结点构成
结点的信息包括:结点的值和指向下一个结点的地址
2. 构造思路
先 建立一个头结点,再一个接一个建新的结点,最后以NULL结尾(便于遍历链表)
3.具体做法
struct ListNode* initList(){
int n;
cin>>n; // 控制长度
struct ListNode* p =NULL; //定义头指针喝头结点
struct ListNode* temp = (struct ListNode* )malloc(sizeof(struct ListNode));
cin>>temp->val; //设置头结点
temp->next = NULL;
p = temp; //联系头指针和头节点
for(int i=1;i<n;i++){//循环继续后续链条
//开辟空间
struct ListNode * a = (struct ListNode *)malloc(sizeof(struct ListNode));
cin>>a->val;//设置结点
a->next = NULL;
temp->next=a;// 连接 头节点和第一个后续结点
temp=temp->next;//将后续结点作为前驱结点
}
return p;
二、插入结点(首中尾状况)
1.原链表无结点为NULL
返回 插入结点
2.设置插入范围控制在首中尾
先得到 链表长度
if(position<1||position>length+1){
printf("位置参数超过范围");
return head;
3.首
画个就知道,要在第一个前面插元素,只要
nodeInsert->next = head
再将nodeInsert设为 = head 返回head
4.中尾
通过一个小套路
struct listnode * pnode =head
int count = 1
while(count<position-1){
pnode = pnode->next;
count ++;
}将 pnode 设置成目标插入位置的前一结点
nodeInsert ->next = pnode ->next;
pnode->next = nodeInsert;
三、删除结点(删除用free())
1.原链表无结点为NULL
返回NULL
2.设置删除范围控制在首中尾
if(position<1||position>length){
printf("位置参数超过范围");
return head;
3.首
struct listnode* p = head;
head = head->next;
free(p)
4.中尾
利用上面的小套路(插入元素)
得到pnode 为目标前一个结点
struct listnode* p = pnode->next;
pnode ->next = p->next;
free(p)
总结
在处理删除插入的连接问题时,最好在纸上画上关系图,可以减少变量名混淆而减少理解信心。