请编写一个函数,用于删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点 head ,只能直接访问 要被删除的节点 。(题目数据保证需要删除的节点不是末尾节点 )
删除链表结点必须找的该结点的前驱,无法访问头结点,则不能通过前驱结点直接修改next指针的方式进行删除。那么解体原理就是整体移动链表的value,删掉最后一个节点。这样就完成删除的转移。
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
void deleteNode(struct ListNode* node) {
struct ListNode*Prenode=node;
while(node->next) //由删除结点开始,结点的val前移
{
node->val=node->next->val;
Prenode=node; //记录node的前驱
node=node->next;
}
//结束之后,node指向链表的末尾
//释放末尾的空间
free(node);
Prenode->next=NULL;
}
若可以访问头结点,删除单链表L第i个结点,并用e返回。
Status ListDelete_L(LinkList_L& L, int i, ElemType e)
{
LNode* p = L, * q;
int j = 0;
while (p->next && j < i - 1)//找i-1结点
{
p = p->next;
++j;
}
if (!p->next || j > i - 1)return ERROR;
q = p->next;//临时存放被删除的结点地址
p->next = q->next;
e = q->data;
delete q;
return OK;
}