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

链表相关操作三

2013年12月13日 ⁄ 综合 ⁄ 共 2936字 ⁄ 字号 评论关闭
#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;
}


抱歉!评论已关闭.