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

2018-01-30  本文已影响15人  林大鹏

题目:

给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。

思路:

代码:

#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;
}

上一篇 下一篇

猜你喜欢

热点阅读