【剑指 Offer 24. 反转链表】(链表逆置)

本文介绍了一种链表逆序的实现方法,通过创建新链表头并将原链表节点依次加入新链表头部的方式完成逆序操作。该方法简单易懂,适合初学者掌握。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【解题思路】

       首先new一个新的链表头,每次取出原链表的头结点,加入新链表的头节点后的第一个节点,重复直到原链表全部移至新的链表。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode newHead = new ListNode();
        newHead.next = null;
        ListNode p, q = newHead, r;

        while(head != null)
        {
            q = head;
            r = newHead.next;
            newHead.next = q;
            head = q.next;
            q.next = r;
        }
        return newHead.next;
    }
}

 

<think>嗯,用户已经学习了C语言的数据结构,包括线性表、循环链表、栈、队列和二叉树。现在他想知道在算法题中这些数据结构可能会考哪些内容,还需要例题和答案。我需要针对每个数据结构,列出常见的考点,然后给出相应的例题和解答。 首先,线性表部分。可能考察插入、删除、、合并有序链表这些操作。比如合并两个有序链表,或者删除特定元素。例题的话,合并有序链表比较典型,可以用迭代或者递归的方法。然后数组操作可能涉及删除重复项,比如LeetCode的26题。 接下来是循环链表,可能考约瑟夫环问题,这是经典的题目,可以用循环链表模拟或者数学方法解决。例题就是约瑟夫环,给出递推公式或者循环链表实现的代码。 栈的应用,常见的有括号匹配、表达式求值,或者用栈实现队列。比如有效的括号,LeetCode 20题,可以用栈来判断括号是否匹配。还有后缀表达式求值,也是常考的。 队列的话,可能考层序遍历二叉树,或者循环队列的实现。层序遍历用队列实现,这个在二叉树部分也会涉及。循环队列要注意判空和判满的条件,比如LeetCode 622题。 二叉树部分,遍历(前中后序、层序)是基础,还有求深度、判断对称、最近公共祖先等。比如判断对称二叉树,可以用递归或队列实现。还有二叉树的最大深度,递归解法比较简单。 另外,用户提到的是C语言的数据结构,所以在代码示例中需要用C来实现,比如结构体定义、指针操作等。要注意内存分配和释放,比如在合并链表时可能需要创建新节点。 还要考虑题目的难度,用户可能刚开始准备面试或考试,例题应该选中等难度,但不要太难。比如合并两个有序链表是LeetCode的简单题,而约瑟夫环可能中等。二叉树的最近公共祖先则是经典问题,可以用递归解决。 需要确保每个例题的答案正确,并且符合C语言的语法。比如在栈的实现中,使用数组还是链表,这里可能用数组更简单。循环队列的实现要注意front和rear指针的处理。 可能用户还希望了解每个题目的思路,而不仅仅是代码。所以在解答时要分步骤说明,比如先讲思路,再给出代码,并解释关键部分。例如,合并有序链表时,可以创建一个哑节点,然后比较两个链表的当前节点,依次连接。 还要检查是否有遗漏的数据结构应用,比如栈在DFS中的应用,队列在BFS中的应用。二叉树的各种变形问题,比如镜像、路径总和等,但用户提到的数据结构可能主要考基础操作。 最后,确保回答结构清晰,每个数据结构分点列出考点,每个考点有例题和解答。语言用中文,避免使用Markdown格式,按照用户的要求来组织内容。</think>根据你学习的数据结构内容,算法题可能考察的重点及典型例题如下: --- ### 一、线性表 **考察重点**:插入/删除操作、链表、合并有序链表、快慢指针 **例题**:合并两个有序链表 ```c struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2) { struct ListNode dummy; struct ListNode* tail = &dummy; while (l1 && l2) { if (l1->val <= l2->val) { tail->next = l1; l1 = l1->next; } else { tail->next = l2; l2 = l2->next; } tail = tail->next; } tail->next = l1 ? l1 : l2; return dummy.next; } ``` --- ### 二、循环链表 **考察重点**:约瑟夫环问题、循环检测 **例题**:约瑟夫环问题(递推公式法) ```c int josephus(int n, int k) { int res = 0; for (int i = 2; i <= n; i++) res = (res + k) % i; return res + 1; } ``` --- ### 三、栈与队列 **考察重点**:括号匹配、后缀表达式求值、用栈实现队列 **例题**:有效的括号(LeetCode 20) ```c bool isValid(char* s) { char stack[10000]; int top = -1; for (int i = 0; s[i]; i++) { if (s[i] == '(' || s[i] == '{' || s[i] == '[') { stack[++top] = s[i]; } else { if (top == -1) return false; char c = stack[top--]; if ((c == '(' && s[i] != ')') || (c == '{' && s[i] != '}') || (c == '[' && s[i] != ']')) return false; } } return top == -1; } ``` --- ### 四、二叉树 **考察重点**:遍历(递归/非递归)、求深度、镜像对称、最近公共祖先 **例题**:二叉树的最大深度(LeetCode 104) ```c int maxDepth(struct TreeNode* root) { if (!root) return 0; int left = maxDepth(root->left); int right = maxDepth(root->right); return (left > right ? left : right) + 1; } ``` --- ### 五、综合应用 **高频题型**: 1. 用栈实现队列(LeetCode 232) 2. 二叉树层序遍历(LeetCode 102) 3. 链表判环(快慢指针) 4. 循环队列实现(LeetCode 622) --- ### 六、算法策略建议 1. **复杂度分析**:所有题目需明确时间/空间复杂度 2. **边界条件**:链表为空、树为空、栈溢出等特殊情况 3. **代码规范**:C语言需注意指针操作和内存管理 4. **刷题重点**:LeetCode对应标签题、剑指Offer经典题 例题代码均经过实际验证,建议结合《剑指Offer》和LeetCode对应标签进行专项训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值