16 把第 i 个结点从链表中删除

Posted shanlu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了16 把第 i 个结点从链表中删除相关的知识,希望对你有一定的参考价值。

这里先删除第2个结点,测试 deleNode 函数

 1 /*把第i个结点从链表中删除*/
 2 
 3 
 4 #include<stdio.h>
 5 #include<stdlib.h>
 6 
 7 //链表中节点的结构
 8 typedef struct Link {
 9     int  data;
10     struct Link* next;
11 }link;
12 
13 //链表初始化
14 link* initByTailInsert() {
15     link* phead = NULL;//创建头指针
16     link* first_node = (link*)malloc(sizeof(link));//创建第一个节点
17     //第一个结点先初始化
18     first_node->data = 1;
19     first_node->next = NULL;
20     phead = first_node;//头指针指向第一个节点
21 
22     //尾插入赋值
23     for (int i = 2; i < 5; i++) {
24         link* new_node = (link*)malloc(sizeof(link)); //申请新的结点
25         new_node->data = i;
26         new_node->next = NULL;
27         first_node->next = new_node;  //第一个结点的指针域指向这个新申请的结点
28         first_node = new_node;  //第一个结点后移
29     }
30 
31     printf("头指针指向的值是:%d\\n", phead->data);//1
32     return phead;  //将指向第一个结点的头指针返回
33 }
34 
35 
36 
37 void showLink(link* phead) {
38     link* tmp = phead;//将头指针赋给tmp,tmp也是一个头指针
39     //只要tmp指针指向的结点的next不是Null,就执行输出语句。
40     while (tmp != NULL) {
41         printf("%d ", tmp->data);
42         tmp = tmp->next;
43     }
44     printf("\\n");
45 }
46 
47 link* getElemByNum(link* phead,int num) {
48     int j = 1; //计数器
49     link* tmp = phead;
50     while (tmp != NULL && num>j) {
51         tmp = tmp->next;
52         j++;
53     }
54     if (tmp == NULL || num<j) {
55         //printf("这个元素不存在\\n");
56         return NULL;
57     }
58     else {
59         return tmp;
60     }
61 }
62 
63 
64 void deleNode(link* phead,int num) {
65     link* tmp = phead;
66     link* front_node = getElemByNum(tmp,num - 1);
67     link* back_node = getElemByNum(tmp, num + 1);
68     link* cur_node = getElemByNum(tmp,num);
69     front_node->next = back_node;
70     free(cur_node);
71     showLink(tmp);
72 }
73 
74 
75 void main() {
76     //初始化链表(1,2,3,4)
77     printf("初始化链表为:\\n");
78     link* phead = initByTailInsert(); //创建头指针,得到经过初始化后的头指针
79     showLink(phead);
80     int num = 0;
81     printf("请输入要删除的结点的号码:");
82     scanf("%d", &num);
83     link* isfind = getElemByNum(phead, num);
84     if (isfind != NULL) {
85         //printf("第%d个元素是:%d", num, isfind->data);
86         printf("删除第%d个结点后的链表是:\\n", num);
87         deleNode(phead,num);
88     }
89     else {
90         printf("这个结点没找到\\n");
91     }
92 
93 }

 

以上是关于16 把第 i 个结点从链表中删除的主要内容,如果未能解决你的问题,请参考以下文章

《剑指Offer》题目:链表中倒数第k个结点

删除链表第index个结点

从链表中删除节点

从链表中删除总和值为0的连续节点

剑指Offer面试题15(Java版):链表中倒数第K个结点

从链表中删除一个节点