1. 程式人生 > >輸出倒數第k個節點+反轉連結串列+合併兩個有序連結串列

輸出倒數第k個節點+反轉連結串列+合併兩個有序連結串列

要求:遍歷連結串列一邊

#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;
    }
}