题目:
定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
解法:
// 解法一: 翻转 链表
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;
}
网友评论