链表相关操作三

来源:互联网 发布:淘宝秒杀图片大全 编辑:程序博客网 时间:2024/04/29 12:59
#include <iostream>  #include <string>  using namespace std;    struct Node  //一个链表的结点结构{    int data ;    Node *next ;  };  typedef struct Node Node ;    void traverse(Node *head);//遍历链表Node * reverse(Node * head); //已知链表的头结点head,写一个函数把这个链表逆序Node * merge(Node *head1, Node * head2);//合并链表,结果有序排列Node *merge_recursive(Node *head1, Node *head2);//递归有序合并链表int get_len(Node *head);//获得链表的长度Node * reverse(Node * head) {     if(head == NULL)          return head;        Node *p = head->next;      if(p == NULL)          return head;        Node *q = p->next;      if(q == NULL) {          head->next = NULL;          p->next = head;          return p;      }        head->next = NULL;      while(q) {          p->next = head;          head = p;          p = q;          q = q->next;      }      p->next = head;      return p;  }    Node * merge(Node *head1, Node * head2) {      if(head1 == NULL)          return head2;            if(head2 == NULL)          return head1;        Node *p = NULL; //开头较小的      Node *q = NULL; //开头较大的      Node *head = NULL; //返回的      Node *qprev = NULL;      Node *pprev = NULL;        if(head1->data <= head2->data) {          p = head1;          q = head2;          head = head1;      }      else {          p = head2;          q = head1;          head = head2;      }      //拆散q到p      while(p && q) {          if(p->data <= q->data) {              pprev = p;              p = p->next;          }          else {              qprev = q;              q = q->next;                            pprev->next = qprev;              qprev->next = p;                pprev = qprev;          }      }        return head;  }    Node *merge_recursive(Node *head1, Node *head2) {      Node *head = NULL;        if(head1 == NULL)          return head2;      if(head2 == NULL)          return head1;        if(head1->data <= head2->data) {          head = head1;          head->next = merge_recursive(head1->next, head2);      }      else {          head = head2;          head->next = merge_recursive(head1, head2->next);      }      return head;  }
node *sort(node* head);////单链表排序 node *reverse(node *head);//单聊表逆置void search_mid(node *head,node *mid);//给出一个单链表,不知道节点N的值,只遍历一次出中间节点/*8、给定一个单向链表,设计一个时间优化并且空间优化的算法,找出该链表的倒数第m个元素。实现您的算法,注意处理相关的出错情况。m定义为当m=0时,返回链表最后一个元素。    解析:这是一个难题,我们需要的是倒数第m个元素,所以如果我们从某个元素开始,遍历了m个元素之后刚好到达链表末尾,那么这个元素就是要找的元素。也许从链表的尾部倒推回去不是最好的办法,那么我们可以从链表头开始计数。    思路一:我们可以先一次遍历求出链表的总长度n,然后顺序变量求出第n-m个元素,那么这个就是我们要找的元素了。    思路二:我们用两个指针,一个当前位置指针p和一个指向第m个元素的指针q,需要确保两个指针之间相差m个元素,然后以同样的速度移动它们,如果当q到达链表末尾时,那么p指针就是指向倒数第m个元素了。*/node *search_last_element1(node *head,int m);//查找链表倒数第m个数值,方法一node *search_last_element2(node *head,int m);//查找链表倒数第m个数值,方法二

node *sort(node *head){node *p;int n;int temp;n = length(head);if(head == NULL || head->next == NULL)//如果只有一个或者没有结点{return false;}p = head;for(int j=1; j<n; j++){p = head;for(int i=0;i<n-j;i++){if(p->data > p->next->data)//从小到大排列{temp = p->data;p->data = p->next->data;p->next->data = temp;}p = p->next;}}return head;}node *reverse(node *head){node *p1,*p2,*p3;if(head == NULL || head->next == NULL){return head;}p1 = head;p2 = p1->next;while(p2)//顺序移动p1,p2,p3的位置{p3 = p2->next;p2->next = p1;p1 = p2;p2 = p3;}head->next = NULL;head = p1;//以上两步将头结点指向末尾,另一个开始return head;}void remove_head(node *head){node *p = head;head = head->next;free(p);}void searchmid(node *head,node *mid){node *p,*q;p = head;q = head;while(p->next->next != NULL){p = p->next->next;q = q->next;}mid = q;}node *search_last_element1(node *head,int m){if(head == NULL){return NULL;}node *p = head;int count = 0;while(p != NULL){p = p->next;count++;}if(count<m)return NULL;p = head;for(int i=0; i<count-m; i++){p = p->next;}return p;}node *search_lase_element2(node *head,int m){if(head == NULL)return head;node *p,*q;p = head;q = head;for(int i=0; i<m; i++){if(p->next != NULL){p = p->next;}else{return NULL;}}while(p->next != NULL){p = p->next;q = q->next;}return q;}