LeetCode的数组242题和链表25题(C++)

数据结构的复习(结合LeetCode题目)

1. 数组

①题目:

  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.链表

①题目:

  1. 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上的解答,此博客仅用来记录一我的大致结题过程。

发布了11 篇原创文章 · 获赞 6 · 访问量 1614

猜你喜欢

转载自blog.csdn.net/qq_41119146/article/details/103484620
今日推荐