一些笔试的时候,有ACM模式输入输出链表的情景,怎么处理它的输入输出,转换成我们熟悉的模式?
例如
反转链表
输入:1->2->3->NULL
输出:3->2->1->NULL
这里以C++为例子,用简单的方式,教你处理链表的输入输出!!!
先定义链表
struct ListNode {
int val;
ListNode *next;
ListNode() : val(0), next(nullptr) {}
ListNode(int x) : val(x), next(nullptr) {}
};
思路:对于输入1->2->3->NULL,用一个字符串s处理输入,然后把s中的数字分离出来,存入vector中,通过这个vector来构建链表。
//把链表输入形式中的数字,纳入vector中
vector<int> CreateVector(const string& s){
vector<int> res;
string numStr; // 临时存储拼接的数字字符串
for (char c : s) { // 遍历字符串的每个字符
if (isdigit(c)) { // 判断是否是数字
numStr += c; // 拼接数字字符
} else {
// 遇到非数字,且之前有拼接好的数字字符串
if (!numStr.empty()) {
res.push_back(stoi(numStr)); // 转int存入
numStr.clear(); // 重置,准备下一个数字
}
}
}
// 处理字符串末尾的数字(比如 "1->2->3" 最后一个3,遍历结束后未存入)
if (!numStr.empty()) {
res.push_back(stoi(numStr));
}
return res;
}
//通过vector构建链表
ListNode* CreateListNode(const vector<int>& nums){
ListNode* dummyHead=new ListNode();
ListNode* curr=dummyHead;
for(int v:nums){
ListNode* tem=new ListNode(v);
curr->next=tem;
curr=curr->next;
}
return dummyHead->next;
}
int main(){
string s;
getline(cin,s);
//构建出我们常用的链表
ListNode* head=CreateListNode(CreateVector(s));
//...后续使用
}
打印链表,输出格式为:1->2->3->NULL
// 打印链表(格式:1->2->3->NULL)
void printList(ListNode* head) {
ListNode* curr = head;
while (curr != nullptr) {
cout << curr->val;
if (curr->next != nullptr) {
cout << "->";
}
curr = curr->next;
}
cout << "->NULL" << endl;
}
3783

被折叠的 条评论
为什么被折叠?



