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

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

作者: 果哥爸 | 来源:发表于2018-01-24 11:40 被阅读16次

    题目:

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

    解答:

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

    链表节点:

    #import <Foundation/Foundation.h>
    
    @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 <Foundation/Foundation.h>
    
    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 : 从尾到头打印链表】

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