链表就地逆置和合并
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;
}
相关文章推荐
- 24 单链表就地逆置,合并链表
- 单链表就地逆置以及链表合并
- 单链表的就地逆置
- 单链表的应用 就地逆置
- 单链表就地逆置
- 线性表的就地逆置(数组实现+链表实现)
- 带头结点的单链表就地逆置
- 单链表的实现(包括就地逆转单链表,表排序, 合并单链表、判断表是否有环)
- 就地逆置带头结点的单链表
- 【C++】模版实现双向链表的各种操作(如:逆置、去重Unique、分类(冒泡)、合并)
- C语言链表就地逆置操作
- 链表就地逆置
- Q24、(链表):链表操作,单链表就地逆置
- 带头结点单链表的就地逆置
- 将链表就地逆置
- 链表 3:单链表就地逆置
- PTA 带头结点的单链表就地逆置(10 分)
- 链表就地逆置
- 单链表就地逆置递归与非递归的方法
- c语言:顺序表的实现(二 ) 就地逆置,有序合并,大小调整。