Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9086
  • 博文数量: 10
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-23 12:00
个人简介

^_^

文章分类

全部博文(10)

文章存档

2014年(5)

2013年(5)

分类: C/C++

2014-03-09 17:06:56

最近工作涉及到很多链表操作,就把它笼统的复习了一遍。
常规的链表操作:

点击(此处)折叠或打开

  1. typedef struct _LIST_NODE_T
  2. {
  3.     void *data;
  4.     struct _LIST_NODE_T *next;
  5. }LIST_NODE_T;

1.链表逆序

点击(此处)折叠或打开

  1. //已知链表的头节点,将链表逆序----单向链表逆序
  2. LIST_NODE_T resever_list(LIST_NODE_T *head)
  3. {
  4.     if(head == NULL || head->next == NULL)
  5.         return head;

  6.     LIST_NODE_T *p1 = head;
  7.     LIST_NODE_T *p2 = p1->next;
  8.     LIST_NODE_T *p3 = p2->next;

  9.     p1->next = NULL;
  10.     while(p3 != NULL)
  11.     {
  12.      p2->next = p1;
  13.         p1 = p2;
  14.         p2 = p3;
  15.         p3 = p3->next;
  16.     }
  17.     p2->next = p1;
  18.     head = p2;
  19.     return head;
  20. }

2.找出链表的中间元素。----一个值得学习的方法。效率o(∩_∩)o 

  1. //找出链表的中间元素
  2. LIST_NODE_T* find_midlist(LIST_NODE_T* head)
  3. {
  4.     if(head == NULL || head->next == NULL)
  5.         return head;
  6.     LIST_NODE_T *p1, *p2;
  7.     p1 = p2 = head;
  8.     while(1)
  9.     {
  10.      if(p2->next != NULL && p2->next->next != NULL)
  11.      {
  12.      p1 = p1->next;
  13.             p2 = p2->next->next;
  14.      }
  15.         else
  16.             break;
  17.     }
  18.     return p1;
  19. }

3.将两个有序的链表合并成一个---常规方法

  1. //已知两个链表的head1 和head 各自有序。要求将其合并成一个链表依然有序
  2. LIST_NODE_T* merge(LIST_NODE_T *head1, LIST_NODE_T *head2, int (*pCmpFunc)(void*, void*))
  3. {
  4.     if(head1 == NULL)
  5.         return head2;
  6.     else if(head2 == NULL)
  7.         return head1;

  8.     if(pCmpFunc == NULL)
  9.         return NULL;
  10.     
  11.     LIST_NODE_T *head;
  12.     LIST_NODE_T *cur;
  13.     LIST_NODE_T *p1;
  14.     LIST_NODE_T *p2;
  15.     
  16.     if(pCmpFunc(head1->data, head2->data) < 0)
  17.     {
  18.         head = head1;
  19.         p1 = head1->next;
  20.         p2 = head2;
  21.     }
  22.     else
  23.     {
  24.         head = head2;
  25.         p2 = head2->next;
  26.         p1 = head1;
  27.     }
  28.     cur = head;
  29.     while(p1 != NULL && p2 != NULL)
  30.     {
  31.      if(pCmpFunc(p1->data, p2->data) < 0)
  32.      {
  33.      cur->next = p1;
  34.             cur = p1;
  35.             p1 = p1->next;
  36.      }
  37.         else
  38.         {
  39.          cur->next = p2;
  40.             cur = p2;
  41.             p2 = p2->next;
  42.         }
  43.     }
  44.     if(p1 == NULL)
  45.         cur->next = p2;
  46.     else if(p2 == NULL)
  47.         cur->next = p1;

  48.     return head;
  49. }
4,将两个有序的链表合并成一个----递归方法

  1. LIST_NODE_T* mergeRecursive(LIST_NODE_T *head1, LIST_NODE_T *head2, int (*pCmpFunc)(void*, void*))
  2. {
  3.     if(head1 == NULL)
  4.         return head2;
  5.     if(head2 == NULL)
  6.         return head1;

  7.     LIST_NODE_T *head = NULL;
  8.     if(pCmpFunc(head1->data, head2->data) < 0)
  9.     {
  10.      head = head1;
  11.         head1->next = mergeRecursive(head1->next, head2, pCmpFunc);
  12.     }
  13.     else
  14.     {
  15.      head = head2;
  16.         head2->next = mergeRecursive(head1, head2->next, pCmpFunc);
  17.     }
  18.     return head;
  19. }

5.删除链表中的某个节点

  1. //只给定单链表某个节点p.删除该节点
  2. void deleNode(LIST_NODE_T *pNode, void (*pFreeFunc)(void *))
  3. {
  4.     if(pNode == NULL)
  5.         return;
  6.     if(pNode->next == NULL)
  7.     {
  8.      if(pFreeFunc != NULL)
  9.             pFreeFunc(pNode->data);
  10.         delete pNode;
  11.         pNode = NULL;
  12.         return;
  13.     }

  14.     LIST_NODE_T pNodeNext = pNode->next;
  15.     pNode->data = pNodeNext->data;
  16.     pNode->next = pNodeNext->next;

  17.     if(pFreeFunc != NULL)
  18.         pFreeFunc(pNodeNext->data);
  19.     delete pNodeNext;
  20.     pNodeNext = NULL;
  21.     return;
  22. }

6.在某个节点前插入元素

  1. //只给定单链表中某个节点p。 在p前面插入节点
  2. void insertNode(LIST_NODE_T *pNode, void *data)
  3. {
  4.     if(pNode == NULL)
  5.         return;
  6.     
  7.     LIST_NODE_T *pNewNode;
  8.     pNewNode = new LIST_NODE_T();
  9.     if(pNewNode == NULL)
  10.     {
  11.      std::cout<<"create new node error"<<std::endl;
  12.         return;
  13.     }
  14.     LIST_NODE_T *pNodeNext = pNode->next;
  15.     pNode->next = pNewNode;
  16.     pNewNode->next = pNodeNext;

  17.     pNewNode->data = pNode->data;
  18.     pNode->data = data;
  19. }

7.给定单链表头节点,删除链表中倒数第k  个节点

  1. //给定单链表头节点,删除链表中倒数第k 个节点
  2. void deleNode1(LIST_NODE_T * phead, int nReserverK, void(* pFreeFunc)(void *))
  3. {
  4.     if(phead == NULL)
  5.         return;
  6.     
  7.     LIST_NODE_T *p1, *p2;
  8.     p1 = p2 = phead;
  9.     for(int i=1; i<=nReserverK; i++)
  10.     {
  11.      p2 = p2->next;
  12.         if(p2 == NULL && i!=nReserverK)
  13.         {
  14.             return;
  15.         }
  16.     }
  17.     while(p2 != NULL)
  18.     {
  19.      p1 = p1->next;
  20.         p2 = p2->next;
  21.     }
  22.     deleNode(p1, pFreeFunc);
  23. }






阅读(519) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~