链表的中间结点(OJ)

给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
如果有两个中间结点,则返回第二个中间结点。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* middleNode(struct ListNode* head) {
    struct ListNode* slow = head;
    struct ListNode* fast = head;
    while(fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;
        
    }
    return slow;    
}
### OJ 1104 题目:链表倒序实现 对于OJ平台上的题目1104——链表倒序,目标是将单向链表中的元素按照相反的顺序重新排列。以下是具体的解决方案。 #### 方法一:迭代法反转链表 通过遍历整个链表,在每次访问新节点时调整指针方向来完成链表的反转操作。此方法的空间复杂度为O(1),因为只用了常量级别的额外空间;而时间复杂度则为O(N),其中N表示链表长度。 ```cpp ListNode* reverseList(ListNode *head){ ListNode *prev = nullptr; while(head != nullptr){ auto nextNode = head->next; // 记录下一个节点位置 head->next = prev; // 当前节点指向前面已经处理过的部分 prev = head; // 移动prev至当前节点 head = nextNode; // 继续处理剩余未处理的部分 } return prev; // 返回新的头部节点 } ``` #### 方法二:递归方式反转链表 利用函数调用栈自然形成的回溯机制来进行链表反转。当到达最后一个节点之后开始逐层返回,并修改各层之间的连接关系直到回到最顶层。这种方法同样可以达到线性的运行效率但是由于涉及到大量的子过程调用所以实际性能可能不如前者稳定。 ```cpp // 定义辅助函数用于内部递归调用 void recursiveReverse(ListNode*& newHead, ListNode* cur){ if(cur -> next == NULL){ // 找到最后一个节点作为新的头结点 newHead = cur; return ; } recursiveReverse(newHead,cur->next); // 修改相邻两个节点间的链接方向 cur->next->next = cur; cur->next = NULL; } // 主接口函数 ListNode* reverseList(ListNode* head) { if(!head || !head->next) return head; ListNode* res=nullptr; recursiveReverse(res,head); return res; } ``` 两种算法都能有效地解决这个问题,选择哪种取决于具体应用场景和个人偏好。通常情况下推荐使用迭代版本因为它更加直观易于理解而且不会受到系统最大递归深度的影响[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值