前提
这个链表不存在重复值的结点
思路
找到这个结点
操作被删除结点的前后指针
复杂度
O(n) 因为你要找到这个结点
代码
- (void)removeObject:(NSObject *)linkData
{
//分两步 第一步找到当前结点 第二步删除操作
//声明被删除的结点
DSNode *deleteNode;
if (linkData)
{
//当前指针指向头部结点
self.current = self.head;
//跳出条件是当前结点 是 nil
while (self.current != nil)
{
//如果当前结点的值 和 要删除的值一样 就找到了要删除的结点
if ([self.current.linkData isEqual:linkData])
{
deleteNode = self.current;
break;
}
self.current = self.current.next;
}
}
//找到被删除结点的前后结点 重新操作前后结点的指针 然后把删除的结点nil 分三种情况头部 尾部 以及中间位置
DSNode *priorNode = deleteNode.prior;
DSNode *nextNode = deleteNode.next;
if (priorNode == nil)
{
self.head = nextNode;
self.head.prior = nil;
}
else if (nextNode == nil)
{
self.tail = priorNode;
self.tail.next = nil;
}
else
{
priorNode.next = nextNode;
nextNode.prior = priorNode;
}
deleteNode = nil;
deleteNode.prior = nil;
deleteNode.next = nil;
_count --;
}
用图来描述他的过程
- 找到要删除的结点
![](https://img.haomeiwen.com/i1304277/39a1b2bb68865385.png)
![](https://img.haomeiwen.com/i1304277/f61f4d7dcaa31c02.png)
![](https://img.haomeiwen.com/i1304277/010a569c58fef116.png)
![](https://img.haomeiwen.com/i1304277/691a9de6130da7eb.png)
循环遍历链表
如果当前结点不是要找的那么current指针后移动一步
如果当前结点是要找的结点返回
如果当前结点是nil跳出循环
-
删除
DSNode *priorNode = deleteNode.prior;
DSNode *nextNode = deleteNode.next;
![](https://img.haomeiwen.com/i1304277/b45e9cabf0a7f276.png)
priorNode.next = nextNode;
nextNode.prior = priorNode;
![](https://img.haomeiwen.com/i1304277/0cf24bbe208984f7.png)
deleteNode = nil;
deleteNode.prior = nil;
deleteNode.next = nil;
网友评论