毎日1つのアルゴリズム(チェーンテーブルの逆順序、サブ文字列などいくつか一緒)


(1)リンクテーブルの順序をアルゴリズムで逆転する.今は再帰式を使わずにやっています.
#include<iostream>
using namespace std;
struct node
{
	int x;
	node *next;
	node()
	{
		x = 0;
		next = NULL;
	};
};

void make(node *head)
{
	node *hea = head;
	for(int i = 0;i<10;i++)
	{
		node *x = new node;
		x->x= i;
		hea->next = x;
		hea = x;
	}
};

void reverse(node *&head)
{
	if(head->next == NULL)
		return;
	node *x = head;
	head = head->next;
	x->next = NULL;
	while(NULL !=head)
	{
		node *y = head;
		head = head->next;
		y->next = x;
		x = y;
	}
	head = x;
	int i ;
};

int main()
{
	node *head = new node;
	//head->x = 4;
	make(head);
	reverse(head);
	return 0;
}

再帰的な方法で実現されるプロセスは、次のとおりです.
node* reverse2(node *oldhead,node *newhead = NULL )
{
	node *next = oldhead->next;
	oldhead->next = newhead;
	newhead = oldhead;
	return (NULL == next) ? newhead:reverse2(next,newhead);
};

(2)1つのアルゴリズムで1つのループのリンクテーブルにノードを挿入するが,リンクテーブルを通り抜けてはならない.
リンク表を通り抜けるとは何か分かりませんが、ループしないなら、スタートポイントを1つ設定すればいいだけですが、どこに挿入するか分かりません.
(3)文字列を逆さまにする.速度を最適化します.スペースの最適化
void reverseChar(char *str)
{
	char *start = str;
	int n = strlen(str);
	char *p = str+n-1;
	while(start < p)
	{
		char c = *start;
		*start = *p;
		*p=c;
		start++;
		p--;
  }
}

(4)サブ文字列が見つかりました.速度を最適化します.空間を最適化します.
利用するSundayアルゴリズム
int sunday(const char *src,const char *des)
{
	int i,j,pos=0;
	int len_s,len_d;
	int next[26]={0};                                //next  ,      
	len_s=strlen(src);
	len_d=strlen(des);
	for(j=0;j<26;++j)                       //   next  
		next[j]=len_d;
	for(j=0;j<len_d;++j)                        //  next  
		next[des[j]-'a']=len_d-j; 
	while( pos<(len_s-len_d+1) )               //              
	{
		i=pos;
		for(j=0;j<len_d;++j,++i)              //  
		{
			if(src[i]!=des[j])                //     ,     next  
			{
				pos+=next[src[pos+len_d]-'a'];
				break;
			}
		}
		if(j==len_d)
			return pos;
	}
	return -1;                               //      -1
}


int main()
{
	char src[]="abcdacdaahfacabcdabcdeaa";
	char des[]="abcde";
	cout<<sunday(src,des)<<endl;
	return 0;
}