您的位置:首页 > 其它

链表就地逆置和合并

2015-05-21 22:06 148 查看


题目说明:


(1)单链表就地逆置

(2)合并链表


问题一分析:

逆置后的点链表初始为空,表中的节点不是新生成的,而是从原链表当中一次“删除”,再逐个头插到逆置表中。设逆置链表的初始态为空表,“删除”已知链表中的第一个节点,然后将它“插入”到逆置链表的“表头”,即使得他成为逆置链表中“新”的第一个节点,如此循环,直至原链表为空。

假设有如下数据结构:

#define ElemType char

typedef struct Node{

ElemType data;

struct Node *next;

}Node,*LinkList;



代码如下:

void ReverseList(LinkList L)

{

Node *p,*q;

p = L->next;
/*p为原链表的当前处理节点*/

L->next = NULL;
/*逆置单链表初始为空*/

while(p != NULL){
/*当原链表未处理完*/

q = p->next;
/*q指针保留原链表当前处理节点的下一个节点*/

p->next = L->next;
/*将当前处理节点p插入到逆置L的表头*/

L->next = p;

p = q; /*p指向下一个待插入的节点*/

}

}

同时给出头插法建立链表的代码:

void CreatList(LinkList L)

{

Node *s;

char c;

int flag = 1;

while(flag){

c = getchar();

if(c != '$'){

s = (Node*)malloc(sizeof(Node));

s->data = c;

s->next = L->next;

L->next = s;

}else

flag = 0;

}

}

问题二:合并链表

//保持有序的合并

Node* merge(Node* h1, Node* h2)

{

if (h1 == NULL) return h2;

if (h2 == NULL) return h1;

Node* head;

if (h1->data > h2->data)

{

head = h2; h2 = h2->next;

}

else

{

head = h1; h1 = h1->next;

}

Node* current = head;

while (h1 != NULL||h2 != NULL)

{

if (h1 == NULL || (h2 != NULL&&h1->data > h2->data))

{

current->next = h2;

h2 = h2->next;

current = current->next;

}

else

{

current->next = h1;

h1 = h1->next;

current = current->next;

}

}

current->next = NULL;

return head;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: