【剑指Offer学习】【面试题5 : 从尾到头打印链表】

题目:

输入个链表的头结点,从尾到头反过来打印出每个结点的值。

解答:

思路:遍历链表,将每个节点入栈,然后遍历栈,将节点打印出来!

链表节点:

#import 

@interface NSListNode : NSObject
// value
@property (nonatomic, assign) NSString *value;
// next
@property (nonatomic, strong) NSListNode *next;
@end

自定义栈:

// 只要参数是一个id类型的block
typedef void (^StackBlock)(id objc);

@interface NSCustomStack : NSObject
// 入栈
-(void)push:(id)objet;
// 出栈
-(id)popTopElement;
// 返回栈顶元素
-(id)TopElement;
// 是否为空
-(BOOL)isEmpty;
// 栈的长度
-(NSInteger)stackLength;
// 遍历,从栈底开始遍历
-(void)traversalElementFromBottom:(StackBlock)block;
// 从顶部开始遍历
-(void)traversalElementFromtop:(StackBlock)block;
// 所有元素出栈,一边出栈一边返回元素
-(void)traversalElementPopStack:(StackBlock)block;
// 清空
-(void)removeAllObjects;
// 返回栈顶元素
-(id)topElemet;
@end

栈的实现:

#import "NSCustomStack.h"

@interface NSCustomStack()

// 有入栈就有出栈的时候,使用强引用,就要记得释放引用
/** NSMutableArray */
@property (nonatomic,strong)NSMutableArray *stackArray;

/** top of stack */
@property (nonatomic,assign)NSInteger top;

@end
@implementation NSCustomStack

#pragma mark --------------- Public Methods

// 入栈
-(void)push:(id)objet{
    [self.stackArray addObject:objet];
}

// 出栈
-(id)popTopElement{
    id objc = [self.stackArray lastObject];
    [self.stackArray removeLastObject];
    return objc;
}

// 返回栈顶元素
-(id)TopElement{
    return [self.stackArray lastObject];
}

// 是否为空
-(BOOL)isEmpty{
    return !self.stackArray.count;
}

// 栈的长度
-(NSInteger)stackLength{
    return self.stackArray.count;
}

// 从底部开始遍历
-(void)traversalElementFromBottom:(StackBlock)block{
    NSEnumerator *objc = [self.stackArray objectEnumerator];
    for (id element in objc) {
        block(element);
    }
}

// 从顶部开始遍历
-(void)traversalElementFromtop:(StackBlock)block{
    // 先获取存储元素的个数
    NSInteger count = self.stackArray.count;
    for (NSInteger i = count - 1; i >= 0; i --) {
        // 处理最后一个元素
        block([self.stackArray objectAtIndex:i]);
    }
}

// 所有元素出栈,同时遍历
-(void)traversalElementPopStack:(StackBlock)block{
    // 先获取存储元素的个数
    NSInteger count = self.stackArray.count;
    for (NSInteger i = count - 1; i >= 0; i --) {
        // 处理最后一个元素
        block(self.stackArray.lastObject);
        [self.stackArray removeLastObject];
    }
}

// 返回栈顶元素
-(id)topElemet{
    return self.stackArray.lastObject;
}

// 清空
-(void)removeAllObjects{
    [self.stackArray removeAllObjects];
}

#pragma mark - 懒加载

-(NSMutableArray*)stackArray{
    if (_stackArray == nil) {
        _stackArray = [NSMutableArray array];
    }
    return _stackArray;
}

-(NSInteger)top{
    _top = self.stackArray.count;
    return _top;
}

#pragma mark - 不存在该对象的时候,自动清空
- (void)dealloc{
    if (_stackArray) {
        [_stackArray removeAllObjects];
    }
}
@end

实现函数:

#import "NSListNode.h"
#import "NSCustomStack.h"
#import 

void printListInverselyUsingIteration(NSListNode *root) {
    if (root == nil) {
        return;
    }
    
    NSCustomStack *tmpCustomStack = [NSCustomStack new];
    while (root != nil) {
        [tmpCustomStack push:root];
        root = root.next;
    }
    
    [tmpCustomStack traversalElementFromtop:^(NSListNode *listNode) {
        NSLog(@"%@", listNode.value);
    }];
}

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        NSListNode *rootNode = [NSListNode new];
        rootNode.value = @"1";
        rootNode.next = [NSListNode new];
        rootNode.next.value = @"2";
        rootNode.next.next = [NSListNode new];
        rootNode.next.next.value = @"3";
        rootNode.next.next.next = [NSListNode new];
        rootNode.next.next.next.value = @"4";
        rootNode.next.next.next.next = nil;
        
        printListInverselyUsingIteration(rootNode);
        
    }
    return 0;
}

你可能感兴趣的:(【剑指Offer学习】【面试题5 : 从尾到头打印链表】)