题目
题解
typedef struct LinkNode{
char* val;
struct LinkNode* prev;
struct LinkNode* next;
} LinkNode, *LinkList;
char * simplifyPath(char * path){
char* ptr = strtok(path,"/");
LinkList l = (LinkList)malloc(sizeof(LinkNode));
l->val = "/";
l->prev = NULL;
l->next = NULL;
LinkNode* temp = l;
while(ptr != NULL){
if(strcmp(ptr,".") == 0){
//
}else if(strcmp(ptr,"..") == 0){
if(temp->prev != NULL){
temp = temp->prev;
temp->next = NULL;
}
}else{
LinkNode* newone = (LinkNode*)malloc(sizeof(LinkNode));
newone->val = ptr;
newone->prev = temp;
newone->next = NULL;
temp->next = newone;
temp = temp->next;
}
ptr = strtok(NULL,"/");
}
if(l->next == NULL){
char* result = (char*)malloc(sizeof(char)*2);
result[0] = '/';
result[1] = '\0';
return result;
}
char* result = (char*)malloc(sizeof(char)*3000);
for(int i = 0; i < 3000; i++){
result[i] = '\0';
}
temp = l->next;
while(temp != NULL){
strcat(result,"/");
strcat(result,temp->val);
temp = temp->next;
}
return result;
}
要点
用了很多 string.h 中的方法。
根据字符分割字符串strtok(str,",")。
//第一次用时第一个参数是字符串,返回指向分割完成后的第一个字符串的指针。
char* ptr = strtok(str,"/");
//后续使用第一个参数设置为NULL即可,第二个参数保持不变。
while(ptr != NULL){
//...
ptr = strtok(NULL,"/");
}
//特殊情况说明:
strtok("//","/") == NULL而不是一个空字符串""的指针。
字符串比较strcmp(char * str1, char * str2)。
当str1指向的字符串与str2完全一致时返回0,否则返回str1[index]-str2[index],index为第一个不同字符的索引。
字符串拼接strcat(char * str1, char * str2)。
注意在拼接时,str1要有足够的空间来容纳两个字符串。且str1末尾的'\0'会被覆盖,str2末尾的'\0'会一起被复制过去,最终的字符串只有一个'\0'。