美文网首页
【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点

【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点

作者: 林大鹏 | 来源:发表于2018-01-30 17:01 被阅读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;
}

相关文章

网友评论

      本文标题:【剑指Offer学习】【面试题13 :在O(1)时间删除链表结点

      本文链接:https://www.haomeiwen.com/subject/qecfzxtx.html