3.设s和t是表示成单链表的两个串,试编写一个找出s中第1个不在t中出现的字符(假定每个结点只存放1个字符)的算法。,并用cpp写出具体代码
时间: 2024-10-18 12:12:53 浏览: 43
找到字符串S第一个不在T中出现的字符.rar
要解决这个问题,你可以采用双指针策略。首先,创建两个指针分别指向字符串`s`和`t`的开始位置。然后,逐个比较这两个指针所指的字符。当`s`中的字符不在`t`中时,返回该字符。如果遍历完`t`仍然没有找到相同的字符,则说明`s`中的所有字符都在`t`中,此时返回`s`的第一个字符。
以下是使用C++编写的简单代码:
```cpp
#include <iostream>
using namespace std;
struct ListNode {
char val;
ListNode *next;
ListNode(char x) : val(x), next(NULL) {}
};
ListNode* findFirstNotInSecond(ListNode* s, ListNode* t) {
if (!s || !t) return nullptr; // 如果任一链表为空,直接返回
while (s && t) {
if (s->val != t->val) { // 如果当前字符不同
return s; // 返回第一个不同字符所在的节点
}
s = s->next; // 指向下一个s字符
t = t->next; // 指向下一个t字符
}
return s; // 如果遍历完t还没有发现不同的字符,说明s的所有字符都在t里,返回s的第一个字符
}
int main() {
// 创建链表示例
ListNode* s = new ListNode('a');
s->next = new ListNode('b');
s->next->next = new ListNode('c');
s->next->next->next = new ListNode('d'); // 更多字符...
ListNode* t = new ListNode('b');
t->next = new ListNode('c');
t->next->next = new ListNode('e'); // 不包含'd'
ListNode* result = findFirstNotInSecond(s, t);
if (result) {
cout << "The first character not in the second string is: " << result->val << endl;
} else {
cout << "All characters in the first string are also in the second string." << endl;
}
return 0;
}
```
这段代码首先定义了一个链表节点结构`ListNode`,然后实现了`findFirstNotInSecond`函数,该函数接受两个链表头节点作为输入,返回第一个不在第二个链表中出现的字符的节点,如果没有这样的字符则返回`nullptr`。
阅读全文