輸出倒數第k個節點+反轉連結串列+合併兩個有序連結串列
阿新 • • 發佈:2018-12-17
要求:遍歷連結串列一邊
#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; } }