美文网首页iOS 剑指offer
【剑指Offer学习】【面试题16:反转链表】

【剑指Offer学习】【面试题16:反转链表】

作者: 林大鹏 | 来源:发表于2018-01-30 17:00 被阅读69次

题目:

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

解法:

// 解法一: 翻转 链表
NSListNode * reversionListNode (NSListNode *listNode) {
    if(listNode == nil) {
        return nil;
    }
    
    // 链表 头结点
    NSListNode *headerNode = nil;
    // 链表 当前 结点
    NSListNode *currentNode = listNode;
    // 链表 前一跳 结点
    NSListNode *previousNode = nil;
    // 链表 后一跳 结点
    NSListNode *nextNode = nil;
    
    while (currentNode != nil) {
        // 赋值 头结点
        headerNode = currentNode;
        // 赋值 下一跳 结点
        nextNode = currentNode.next;
        // 赋值 当前 结点的下一跳
        currentNode.next = previousNode;
        // 赋值 上一跳 结点
        previousNode = currentNode;
        // 赋值 当前 结点
        currentNode = nextNode;
    }
    return headerNode;
}

// 解法二: 递归翻转 链表

NSListNode *recursionReversalListNode(NSListNode *headerNode) {
    if (headerNode == nil || headerNode.next == nil) {
        return headerNode;
    }
    NSListNode *newHeaderNode = recursionReversalListNode(headerNode.next);
    headerNode.next.next = headerNode;
    headerNode.next = NULL;
    return newHeaderNode;
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSListNode  *firstListNote = [[NSListNode alloc] init];
        firstListNote.value =  @"1";
        firstListNote.next = [[NSListNode alloc] init];
        firstListNote.next.value = @"3";
        firstListNote.next.next = [[NSListNode alloc] init];
        firstListNote.next.next.value = @"5";
        firstListNote.next.next.next = nil;

       NSListNode *mergeListNode = reversionListNode(firstListNote);

        while (mergeListNode != nil) {
            NSLog(@"%@", mergeListNode.value);
            mergeListNode = mergeListNode.next;
        }
    }
    return 0;
}

相关文章

网友评论

    本文标题:【剑指Offer学习】【面试题16:反转链表】

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