给你这样一个链表,你如何在3节点前插入一个节点并且不遍历这个链表。
你如何在把3节点删除不遍历这个链表。
给出思路,在3节点后面插入一个节点:
并将其赋予3节点的值:
最后将三节点的值改为要插入的值:
大功告成,贴上代码:
- void SListInsertBefore(SLTNode* pos,SLTDataType x)
- {
- assert(pos);
- SLTNode *newnode=(SLTNode *)malloc(sizeof(SLTNode));
- newnode->data = pos->data;
- newnode->next = pos->next;
- pos->next = newnode;
- }
二、不遍历删除一个节点
上思路:先把4节点的值赋予3节点。
然后将3节点的next指向4节点的下一个。
最后再将4节点销毁。
上代码:
- void SListErasePos(SLTNode* pos)
- {
- assert(pos&&pos->next);
- SLTNode* next = pos->next;
- pos->data = next->data;
- pos->next = pos->next->next;
- free(next);
- next = NULL;//养成好习惯,吧malloc的空间释放掉
- }
这个方法还是有一个缺陷,就是pos不能指向最后一个节点。而上一个方法就没有这个烦恼。
对于这些方法也不用太纠结,因为日常使用中双向链表才是最实用的。
我们用纯c语言写链表在头删头插的地方经常会应用到二级指针,这里有一个更合理的处理方式:
加上一个头标兵头结点,且头节点不存放任何数据
这个有多舒服,就比如头插的时候直接在头结点后加一个节点就行了也不用判断是否为空节点,头删的时候直接让头结点指向2号节点。