zoukankan      html  css  js  c++  java
  • 向有序的环形单链表中插入新节点

    【说明】:

      本文是左程云老师所著的《程序员面试代码指南》第二章中“向有序的环形单链表中插入新节点”这一题目的C++复现。

      本文只包含问题描述、C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书。

      感谢左程云老师的支持。

    【题目】:

      一个环形单链表从头节点 head 开始不降序,同时由最后的节点指向头节点。给定这样的一个环形单链表的头节点 head 和一个整数 num,请生成节点值为 num 的新节点,并插入到这个环形链表中,保证调整后的链表依然有序。

     【思路】:

      解法:注意头节点的处理

    【编译环境】:

      CentOS6.7(x86_64)

      gcc 4.4.7

     【实现】:

      实现及测试代码:

     1 /*
     2  *文件名:list_insert.cpp
     3  *作者
     4  *摘要:向有序的环形链表中插入新节点
     5  */
     6 
     7 #include <iostream>
     8 
     9 using namespace std;
    10 
    11 class Node
    12 {
    13 public:
    14     Node(int data)
    15     {
    16         value = data;
    17         next = NULL;    
    18     }
    19 public:
    20     int value;
    21     Node *next;
    22 };
    23 
    24 Node* insertNum(Node *head,int num)
    25 {
    26     Node *n = new Node(num);
    27     if(NULL == head)
    28     {
    29         n->next = n;
    30         return n;
    31     }
    32     
    33     Node *pre = head;
    34     Node *cur = head->next;
    35     while(cur != head)
    36     {
    37         if(pre->value <= num && cur->value >= num)
    38             break;
    39         pre = cur;
    40         cur = cur->next;
    41     }
    42     pre->next = n;
    43     n->next = cur;
    44     return head->value < num ? head : n;
    45 }
    46 
    47 //打印环形链表
    48 void printList(Node *head)
    49 {
    50     Node *pre = head;
    51     Node *cur = head->next;
    52     while(cur != head)
    53     {
    54         cout << pre->value << " ";
    55         pre = cur;
    56         cur = cur->next;
    57     }
    58     cout << pre->value << endl;
    59 }
    60 
    61 int main()
    62 {
    63     Node *head = NULL;
    64     Node *ptr = NULL;
    65     
    66     for(int i =1;i<4;i++)//构造链表
    67     {
    68         if(NULL == head)
    69         {    
    70             head = new Node(i);
    71             ptr = head;
    72             continue;
    73         }
    74         ptr->next = new Node(i);
    75         ptr = ptr->next;    
    76     }
    77     ptr->next = head;    //环形链表
    78 
    79     cout << "Before insertion:" << endl;
    80     printList(head);
    81     cout << "After insertion:" << endl;
    82     head = insertNum(head,0);
    83     printList(head);
    84     return 0;
    85 }
    View Code

    注:

      转载请注明出处;

      转载请注明源思路来自于左程云老师的《程序员代码面试指南》。

  • 相关阅读:
    一步一步理解拖拽Drag(二)
    Android获得屏幕大小和方向
    Android动画之translate(位移动画)
    解决ScrollView中填充内容上下会有阴影的问题
    Android UI 动画效果Animation
    浅谈onInterceptTouchEvent、onTouchEvent与onTouch 事件的分发
    解决ViewFlipper中的onClick事件和onFling事件冲突
    viewpager开源项目 ViewPagerIndicator
    Android LayoutInflater
    Android 动画效果 Animation 动画(讲解了所有的Android动画效果,是一个值得收藏的帖子)
  • 原文地址:https://www.cnblogs.com/PrimeLife/p/5448653.html
Copyright © 2011-2022 走看看