链表就地逆置和合并

来源:互联网 发布:python opencv配置 编辑:程序博客网 时间:2024/05/01 09:46

微笑题目说明:

(1)单链表就地逆置

(2)合并链表


 生气问题一分析:

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

假设有如下数据结构:
  1. #define ElemType char

  2. typedef struct Node{
  3.     ElemType data;
  4.     struct Node *next;
  5. }Node,*LinkList;

  1. 代码如下:
  2. void ReverseList(LinkList L)
  3. {
  4.     Node *p,*q;
  5.     p = L->next;             /*p为原链表的当前处理节点*/
  6.     L->next = NULL;          /*逆置单链表初始为空*/
  7.     
  8.     while(!= NULL){        /*当原链表未处理完*/
  9.         q = p->next;         /*q指针保留原链表当前处理节点的下一个节点*/
  10.         p->next = L->next;   /*将当前处理节点p插入到逆置L的表头*/
  11.         L->next = p;
  12.         p = q;               /*p指向下一个待插入的节点*/
  13.     }
  14. }
同时给出头插法建立链表的代码:
  1. void CreatList(LinkList L)
  2. {
  3.     Node *s;
  4.     char c;
  5.     int flag = 1;
  6.     while(flag){
  7.         c = getchar();
  8.         if(!= '$'){
  9.             s = (Node*)malloc(sizeof(Node));
  10.             s->data = c;
  11.             s->next = L->next;
  12.             L->next = s;
  13.         }else
  14.             flag = 0;
  15.     }
  16. }

问题二:合并链表

//保持有序的合并
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;
}

0 0
原创粉丝点击