题目:链表反转

/*
参考:https://blog.csdn.net/superxiaolong123/article/details/86687733
*/

@interface RCLinkedListNode : NSObject

@property (nonatomic, assign) NSInteger value;
@property (nonatomic, strong) RCLinkedListNode *next;

@end

@implementation RCLinkedListNode

@end

@implementation ViewController

- (void)p_reverseLinkedList {
    RCLinkedListNode *node = [self p_generateLinkedList:5];
    [self p_printLinkedList:node];
    RCLinkedListNode *reversed = [self p_reverse:node];
    [self p_printLinkedList:reversed];
}

//递归写法
- (RCLinkedListNode *)p_reverse2:(RCLinkedListNode *)header {
    if (header == nil || header.next == nil) {
        return header;
    }
    RCLinkedListNode *temp = header.next;//保持一下尾节点
    RCLinkedListNode *newHeader = [self p_reverse2:header.next];//缩小规模的链表
    temp.next = header;//连接尾节点和头
    header.next = nil;
    return newHeader;
}

//就地反转
- (RCLinkedListNode *)p_reverse:(RCLinkedListNode *)header {
    RCLinkedListNode *currentNode = header;
    RCLinkedListNode *newNode;
    while (currentNode) {
        RCLinkedListNode *tempNode = currentNode.next;
        currentNode.next = newNode;
        newNode = currentNode;
        currentNode = tempNode;
    }
    return newNode;
}

- (RCLinkedListNode *)p_generateLinkedList:(NSInteger)count {
    RCLinkedListNode *head = [RCLinkedListNode new];
    head.value = 0;
    RCLinkedListNode *lastNode = head;
    for (NSInteger i = 1; i < count; i++) {
        RCLinkedListNode *node = [RCLinkedListNode new];
        node.value = i;
        lastNode.next = node;
        lastNode = node;
    }
    return head;
}

- (void)p_printLinkedList:(RCLinkedListNode *)node {
    while (node) {
        NSLog(@"%ld", node.value);
        node = node.next;
    }
}
@end