题目:
输入个链表的头结点,从尾到头反过来打印出每个结点的值。
解答:
思路:遍历链表,将每个节点入栈,然后遍历栈,将节点打印出来!
链表节点:
#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;
}
网友评论