要求:遍歷鏈表一邊
#include <iostream>
#include <cstring>
using namespace std;
struct node{
int val;
node * next;
};
node * findNode(node *head,int k)
{
if(head==NULL ||k<=0) return NULL;
node * first = head;
for(int i=0;i<k-1;i++)
{
if(first->next!=NULL) first = first->next;
else return NULL;
}
node *second = head;
while(first->next!=NULL)
{
first = first->next;
second = second->next;
}
return second;
}
void insertNode(node * head,int val)
{
node * p = head;
while(p->next!=NULL)
{
p = p->next;
}
node *newP = new node;
newP->val = val;
newP->next = NULL;
p->next = newP;
}
void traverse(node **head)
{
if(head==NULL) return;
node *p = (*head)->next;
node *pnext;
(*head)->next = NULL;
while(p!=NULL)
{
pnext = p->next;
p->next = *head;
*head = p;
p = pnext;
}
}
int main()
{
int n;
int val;
node **nHead = NULL;
for(;;)
{
cin>>n;
if(n==1)
{
cin>>val;
if(nHead==NULL)
{
node* head = new node;
head->val = val;
head->next = NULL;
nHead = &head;
}
else insertNode(*nHead,val);
}
else if(n==2)
{
traverse(nHead);
if(nHead!=NULL)cout<<(*nHead)->val<<endl;
else cout<<"invalid"<<endl;
}
else
{
cin>>val;
node *n = findNode(*nHead,val);
if(n!=NULL)cout<<n->val<<endl;
else cout<<"invalid"<<endl;
}
}
return 0;
}
遞歸反轉鏈表
node* traverse(node *newLast,node *head)
{
if(head==NULL) return newLast;
node *pnext = head->next;
head->next = newLast;
newLast = head;
return traverse(newLast,pnext);
}
合併兩個有序鏈表
node* mergeList(node *head1,node *head2)
{
if(head1==NULL)return head2;
if(head2==NULL)return head1;
if(head1->val < head2->val)
{
head1->next = mergeList(head1->next,head2);
return head1;
}
else
{
head2->next = mergeList(head1,head2->next);
return head2;
}
}