【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点
2018-01-30 本文已影响15人
林大鹏
题目:
给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。
思路:
- 如果待删除结点是尾结点,遍历链表找到,待删除结点的上一个结点,将其next指针置为nil.
- 如果待删除结点是头结点或者中间结点,将待删除结点的下一个结点值,赋值给待删除结点,同时将待删除结点的下一个结点的下一个结点赋值给当前结点(相当于删除了待删除结点的下一个结点)。
代码:
#import <Foundation/Foundation.h>
// 链表 节点
@interface NSListNode : NSObject
// value
@property (nonatomic, assign) NSString *value;
// next
@property (nonatomic, strong) NSListNode *next;
@end
#import "NSListNode.h"
#import <Foundation/Foundation.h>
void deleteNode (NSListNode *headerNode, NSListNode *toBeDeleteNode) {
if (headerNode == nil) {
return;
}
if (toBeDeleteNode == nil) {
return;
}
// 如果 被删除 结点 是 尾结点
if (toBeDeleteNode.next == nil) {
NSListNode *tmpNode = headerNode;
while (tmpNode.next != toBeDeleteNode) {
tmpNode = tmpNode.next;
}
tmpNode.next = nil;
}
// 中间 结点 或者 头结点
else {
// 将下一个结点的值输入当前待删除的结点
toBeDeleteNode.value = toBeDeleteNode.next.value;
// 待删除的结点的下一个指向原先待删除引号的下下个结点,即将待删除的下一个结点删除 (相当于 删除了当前结点的下一个结点)
toBeDeleteNode.next = toBeDeleteNode.next.next;
}
}
void printListNode (NSListNode *headerNode){
while (headerNode != nil) {
printf("%s", [headerNode.value UTF8String]);
headerNode = headerNode.next;
}
printf("\n");
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSListNode *head = [NSListNode new];
head.value = @"1";
head.next = [NSListNode new];
head.next.value = @"2";
head.next.next = [NSListNode new];
head.next.next.value = @"3";
head.next.next.next = [NSListNode new];
head.next.next.next.value = @"4";
NSListNode *middle = head.next.next.next.next = [NSListNode new];
head.next.next.next.next.value = @"5";
head.next.next.next.next.next = [NSListNode new];
head.next.next.next.next.next.value = @"6";
head.next.next.next.next.next.next = [NSListNode new];
head.next.next.next.next.next.next.value = @"7";
head.next.next.next.next.next.next.next = [NSListNode new];
head.next.next.next.next.next.next.next.value = @"8";
NSListNode *last = head.next.next.next.next.next.next.next.next = [NSListNode new];
head.next.next.next.next.next.next.next.next.value = @"9";
deleteNode(head, nil); // 删除的结点为空
printListNode(head);
NSListNode *node = [NSListNode new];
node.value = @"12";
deleteNode(head, head); // 删除头结点
printListNode(head);
deleteNode(head, last); // 删除尾结点
printListNode(head);
deleteNode(head, middle); // 删除中间结点
printListNode(head);
deleteNode(head, node); // 删除的结点不在链表中
printListNode(head);
}
return 0;
}