zoukankan      html  css  js  c++  java
  • 链表划分

    链表划分:

    给定一个链表和一个值key,将链表划分成两部分,使得划分后小于key的结点在前,大于key的结点在后。在上述两部分中要保持链表中的出现顺序。

    如:给定:1->4->3->2->5->2 和 key = 3.

    返回:1->2->2->4->3->5.

    程序实现:

     1 /************************************
     2 File Name:ListPartition.cpp
     3 Author: godfrey
     4 Created Time: 2016/04/29
     5 *************************************/
     6 #include <iostream>
     7 #include <cstdio>
     8 #include <cstdlib>
     9 using namespace std;
    10 
    11 typedef struct tagSNode{
    12     int value;
    13     tagSNode* pNext;
    14 
    15     tagSNode(int v):value(v),pNext(NULL) {}
    16 }SNode;
    17 //打印链表
    18 void Print(SNode* pHead){
    19     SNode* p = pHead->pNext;
    20     while(p){
    21         cout<<p->value<<" ";
    22         p = p->pNext;
    23     }
    24     cout<<endl;
    25 }
    26 //删除分配结点空间
    27 void Destroy(SNode* pHead){
    28     SNode* p;
    29     while(pHead){
    30         p = pHead->pNext;
    31         delete pHead;
    32         pHead = p;
    33     }
    34 }
    35 //链表划分
    36 void ListPartition(SNode* pHead,int key){
    37     //使用链表分别存储小于key,大于key的数值
    38     SNode* p1Head = new SNode(0);
    39     SNode* p2Head = new SNode(0);
    40     //两个链表当前最后一个元素
    41     SNode* p1Tail = p1Head;
    42     SNode* p2Tail = p2Head;
    43     SNode* p = pHead->pNext;
    44     //遍历原链表
    45     while(p){
    46         if(p->value < key){
    47             p1Tail->pNext = p;
    48             p1Tail = p;
    49         }
    50         else{
    51             p2Tail->pNext = p;
    52             p2Tail = p;
    53         }
    54         p = p->pNext;
    55     }
    56     //将p2链表拼接到p1链表尾部
    57     p1Tail->pNext = p2Head->pNext;
    58     p2Tail->pNext = NULL;
    59     //将拼接好的链表赋值给原链表
    60     pHead->pNext = p1Head->pNext;
    61 
    62     delete p1Head;
    63     delete p2Head;
    64 }
    65 
    66 int main()
    67 {
    68     SNode* pHead = new SNode(0);
    69     for(int i=0;i<10;i++){
    70         SNode* p = new SNode(rand()%100);
    71         p->pNext = pHead->pNext;
    72         pHead->pNext = p;
    73     }
    74 
    75     Print(pHead);
    76     ListPartition(pHead,50);
    77     Print(pHead);
    78     Destroy(pHead);
    79     return 0;
    80 }

    运行结果:

    转载请注明出处:http://www.cnblogs.com/gaobaoru-articles/

    转载请注明出处: C++博客园:godfrey_88 http://www.cnblogs.com/gaobaoru-articles/
  • 相关阅读:
    日期时间函数的调用
    border的应用
    复合选择器(字体样式)
    样式表
    if语句
    JavaScript 简介
    表单元素
    标记及属性
    网页基础知识
    git commit 提交规范 & 规范校验
  • 原文地址:https://www.cnblogs.com/gaobaoru-articles/p/5446192.html
Copyright © 2011-2022 走看看