如何使用Objective-C实现单链表反转?附已有代码
单链表反转方法的Objective-C实现
没问题,我来帮你补全reverse方法的代码,同时拆解每一步的逻辑,让你清楚为什么这么写:
首先给出完整的实现代码:
- (void)reverse { // 边界处理:空链表或者只有一个节点,无需反转 if (!self.head || !self.head.next) { return; } MMNode *prevNode = nil; MMNode *currentNode = self.head; MMNode *nextNode = nil; // 反转后原来的头节点变成尾节点,更新hail(猜测是tail的笔误?) self.hail = self.head; while (currentNode != nil) { // 先保存下一个节点,避免修改指针后丢失后续节点 nextNode = currentNode.next; // 反转当前节点的指向:让它指向之前的节点 currentNode.next = prevNode; // 指针整体后移,准备处理下一个节点 prevNode = currentNode; currentNode = nextNode; } // 循环结束后,prevNode就是新的头节点 self.head = prevNode; }
代码逻辑拆解:
- 边界判断:如果链表是空的,或者只有一个节点,直接返回即可——反转前后链表状态没有变化,没必要做多余操作。
- 指针初始化:用三个指针跟踪当前节点、前一个节点和下一个节点,这是迭代法反转链表的标准做法,能避免链表断链。
- 更新尾节点:反转完成后,原来的头节点会变成新的尾节点,所以把
self.hail(我猜你是想写tail?)设置为原来的head。 - 循环反转:遍历每个节点时,先保存下一个节点的引用,再把当前节点的
next指针指向之前的节点,最后把三个指针依次后移,直到遍历完所有节点。 - 更新头节点:循环结束时,
prevNode会停在原来的尾节点位置,这就是反转后的新头节点,把self.head指向它就完成了整个反转操作。
你可以调用printList方法来验证反转后的结果是否正确~
内容的提问来源于stack exchange,提问作者user9067376
相关产品推荐
相关产品推荐

