LeetCode的数组242题和链表25题(C++)
数据结构的复习(结合LeetCode题目)
1. 数组
①题目:
- 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = “anagram”, t = “nagaram”
输出: true
示例 2:
输入: s = “rat”, t = “car”
输出: false
说明:
你可以假设字符串只包含小写字母。
进阶:
如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况?
②解题思路:
用数组记录各个字母出现次数,如果最后全为0,就表示两字符串是字母异位词。
设置一个长度为26的数组,将初值全部赋为0。先用对应string头文件中包含的size()方法求得两字符串的长度,如果长度不等直接返回false。若相等就进行接下来的比较。根据长度遍历两字符串,对应数组字母位置上,s的++,t的–。然后遍历字母数组,只要发现有位置的数不是0,就返回false。最后return true。
③源码:
class Solution { public: bool isAnagram(string s, string t) { int Alphabet[26] = {0}; int n= s.size(); int m = t.size(); if (n != m) return false; for (int i = 0; i < n; i++) { Alphabet[s[i] - 'a']++; Alphabet[t[i] - 'a']--; } /*for (int i = 0; i < m; i++) { int j = t[i] - 'a'; Alphabet[j]--; }*/ for (int i = 0; i < 26; i++) { if (Alphabet[i] != 0) return false; } return true; } };
2.链表
①题目:
- K 个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
②解题思路:
用链表结点的换位和递归,实现对k个结点一组的翻转。
先定义两个结点的指针,分别指向当前链表的头结点和NULL(空)。当链表不为空时,先遍历,计算链表长度,长度与k比较,只有当长度大于k时才进行链表的翻转。
根据k值,翻转k个结点(置为倒序)。先定义一个结点指针,保存要翻转结点的下一结点。然后将curr结点的next设置为prev(翻转后的“新”链表,初值为NULL)。然后让prev指向该“换了位”的结点,使curr指向未翻转的结点,进行接下来的翻转;最后让head->next指向递归产生的后续结点。(因为head一直指向的是原链表的第一个元素,所以转换后head->next应该指向接下来的结点。例如:原链表为1->2->3->4->5->,k=2;head指向1,将前两个元素换位后,变为2->1,head依然指向1,所以head->next应该指向新产生的后续结点)
最后返回prev即可。
③源码:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* reverseKGroup(ListNode* head, int k) { ListNode* curr = head; ListNode* prev=NULL; if (head == NULL) return 0; int length = 0; while (curr != NULL) { length++; curr = curr->next; } curr = head; if (k > length) return head; else { //换位置 for(int i=0;i<k;i++) { ListNode* next = NULL; next = curr->next; curr->next = prev; prev = curr; curr = next; } head->next=reverseKGroup(curr, k); } return prev; } };
结题思路有参考LeetCode上的解答,此博客仅用来记录一我的大致结题过程。
- 点赞
- 收藏
- 分享
- 文章举报
- C++中将数组线性表转换为链表
- C++中将链表转换为数组描述的线性表
- LeetCode92-反转链表 II(C++实现)
- leetcode_c++:链表:Rotate List(061)
- LeetCode 206: 反转链表 C++实现
- 基于数组和基于链表线性表C++实现
- 【LeetCode刷题之旅】80 删除排序数组中的重复项 II【C++】
- LeetCode(初级算法)数组篇--旋转数组c++
- LeetCode-896.Monotonic Array 单调数组(C++实现)
- LeetCode17.删除排序数组中的重复项 C++
- Leetcode刷题14-237.删除链表中的节点(C++)
- leetcode之链表逆序翻转类-----92/206 逆序 24/25/61/143 按规则翻转 86/234 双指针分治 19/82/83/203 按规则删除
- 1.1数组和链表:160. Intersection of Two Linked Lists(Leetcode)
- C++学习总结——顺序存储,链式存储,索引存储,哈希存储的优缺点,以及vector数组,list链表,十字链表,索引结构,hash表的实现
- C++中将数组线性表转换为链表
- 1.1数组和链表:19. Remove Nth Node From End of List(Leetcode)
- C++中将链表转换为数组描述的线性表
- leetcode_c++:链表:Remove Duplicates from Sorted List II(082)
- leetcode_c++:链表:Reorder List(143)
- leetcode_c++:链表:Reverse Linked Lis(206)