您的位置:首页 > 其它

数列问题 , 经典的链表操作

2014-03-04 20:38 309 查看


int Node_Size ;

struct Node{
int x ;
Node *next ;
};

Node * make_list(int n){
int i  , j ;
stack<int> stk ;
Node *before , *root ;
root = before = (Node *)malloc(sizeof(Node)) ;
before->x = 1 ;
before->next = NULL ;
Node_Size = 1 ;
for(i = 2 ; i <= n ; i++){
j = i ;
while(j){
stk.push(j % 10) ;
j /= 10 ;
}
while(!stk.empty()){
Node_Size++ ;
Node *now = (Node *)malloc(sizeof(Node)) ;
now->x = stk.top() ;
now->next = NULL ;
before->next = now ;
before = now ;
stk.pop() ;
}
}
return root ;
}

void out(Node *root){
Node * p ;
p = root ;
do{
printf("%d->",p->x) ;
p = p->next ;
}while(p != NULL) ;
puts("") ;
}

Node * delete_even(Node *List){
Node *root  , * now , *before;
root = before = List ;
now = before->next ;
while(before->next != NULL  && now->next != NULL){
before->next = now->next ;
before = now->next ;
free(now) ;
now = before->next ;
Node_Size-- ;
}
if(now != NULL && now->next == NULL){
before->next = NULL ;
Node_Size-- ;
}
return  root ;
}

Node * delete_odd(Node *List){
Node *root  , * now , *before;
List = List->next ;
root =  List ;
Node_Size-- ;
root = delete_even(root) ;
return  root ;
}

int gao(int n){
Node_Size = 0 ;
Node * root = make_list(n) ;
int k = 1 ;
while(Node_Size > 1){
// out(root) ;
// cout<<Node_Size<<endl ;
root = k? delete_even(root) : delete_odd(root) ;
k ^= 1 ;
}
int ans = root->x ;
free(root) ;
return ans ;
}

class Test {
public:
static int remain (int   n)
{
return gao(n);
}
};
//start 提示:自动阅卷起始唯一标识,请勿删除或增加。
int main()
{
cout<<Test::remain(0)<<endl;
}
//end //提示:自动阅卷结束唯一标识,请勿删除或增加。


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: