现在的位置: 首页 > 综合 > 正文

链表的翻转合并创建

2013年02月28日 ⁄ 综合 ⁄ 共 1718字 ⁄ 字号 评论关闭
#include <iostream>
using namespace std;

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

Node* createLinkedList(int *,int);
void printLinkedList(Node *);
Node* merge(Node*,Node*);
Node* reverse(Node*);
Node* createLinkedListInReverse(int *a,int n);
void clearLinkedList(Node *);


int main()
{
 int a[8];
 int b[10];
 for(int i=0;i<sizeof(a)/sizeof(int);i++)
         a[i] = 2*i;   
 for(int i=0;i<sizeof(b)/sizeof(int);i++)
         b[i] = 2*i+1;
 Node *head = createLinkedListInReverse(a,8);
 //head = reverse(head);
 printLinkedList(head);
 clearLinkedList(head);
 /*
 Node *c = createLinkedList(b,10);
 c = reverse(c);
 
 printLinkedList(head);
 printLinkedList(c);
 Node *m = merge(head,c);
 printLinkedList(m);
 
 clearLinkedList(m);
 */
 cin.get();  
}

Node* createLinkedList(int *a,int n)
{
      Node *head = new  Node;
      Node *p = head;
      for(int i=0;i<n;i++)
      {
       Node* q = new Node;
       q->value = a[i];
       q->next = 0;
       p->next = q;
       p = q;       
      }
      return head;   
}

Node* createLinkedListInReverse(int *a,int n)
{
      Node *head = new Node;
      Node *p = 0;
      for(int i=0;i<n;i++)
      {
         Node *q = new Node;
         q->value = a[i];
         q->next = p;
         head->next = q;
         p = q;      
      }
      return head;
}

// 按照从小到大合并链表 
Node* merge(Node* list1,Node* list2)
{
      // 删除起始的头节点 
      Node* p = list1->next;
      delete list1;
      Node *q = list2->next;
      delete list2;
      Node *head = new Node;
      head->next = 0;
      Node *iter = head;
      while(p&&q)
      {
         if(p->value>q->value)
         {
           iter->next = q;
           iter = q;
           q = q->next;                    
         }else
         {
           iter->next = p;
           iter = p;
           p = p->next;     
         }                 
      }
      if(p)
        iter->next = p;
      if(q)
        iter->next = q;
      return head;
}
Node* reverse(Node* head)
{
  if(!head||!head->next||!head->next->next) //在只有一个节点之内 
     return head;
  Node *p = head->next;
  Node *q = p->next;
  p->next = 0; //important 
  while(q)
  {
    Node *temp = q->next;
    q->next = p;
    p = q;
    q = temp;        
  }
  head->next = p;
  return head;      
}


void printLinkedList(Node *head)
{
     head = head->next;
     while(head)
     {
      cout<<head->value<<"[ "<<head->next<<" ] ";
      head = head->next; 
     }
     cout<<endl; 
}
void clearLinkedList(Node *head)
{
 while(head)
 {
  Node *p = head;
  head = head->next;
  delete p;
 }
}

翻转的时候记得首个节点的next指针要置0,不然她默认还是指向原始的值,打印会出错

抱歉!评论已关闭.