zoukankan      html  css  js  c++  java
  • 链表翻转

    题目描述

    给出一个链表和一个数k,比如,链表为1→2→3→4→5→6,k=2,则翻转后2→1→6→5→4→3,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→6→5,用程序实现。

    分析与解法

    这个问题与旋转字符串类似,根据给出的k,将链表分为两段X和Y,将他们分别反转即可得到结果。

    首先我们来看下如果要将一个链表反转应该怎么做,比如,链表为1>2>3>4>5>6,反转为6>5>4>3>2>1,代码如下:

     1 ListNode *ReverseList(ListNode *head){
     2     if(head == NULL)
     3         return NULL;
     4     ListNode *ReversedHead = NULL;
     5     ListNode *pNode = head;
     6     ListNode *pPre = NULL;
     7     while(pNode){
     8         ListNode *pNext = pNode->next;
     9         if(pNext == NULL)
    10             ReversedHead = pNode;
    11         pNode->next = pPre;
    12         pPre = pNode;
    13         pNode = pNext;
    14     }
    15 }

    由于是链表,我们可以先将整个链表反转,然后通过记录的相应指针来做少量修改,来重建新的链表,代码如下:

     1 ListNode *RotateList(ListNode *head, int n){
     2     if(head == NULL || n < 0)
     3         return NULL;
     4     int count = 0;     
     5     ListNode *ReversedHead = NULL;   //第二段链表的头结点
     6     ListNode *pNode = head;
     7     ListNode *pPre = NULL;
     8     ListNode *newHead = NULL;      //新的链表的头节点
     9     while(pNode){
    10         ++count;
    11         //第n个节点即为新链表的头结点
    12         if(count == n)
    13             newHead = pNode;
    14         
    15         ListNode *pNext = pNode->next;
    16         if(pNext == NULL)
    17             ReversedHead = pNode;
    18         pNode->next = pPre;
    19         //第n+1个节点为新链表的尾节点
    20         if(count == n+1)
    21             pNode->next = NULL;
    22         pPre = pNode;
    23         pNode = pNext;
    24     }
    25     //head为第一段链表的尾节点
    26     head->next = ReversedHead;
    27     return newHead;
    28 }
  • 相关阅读:
    Memcached 笔记与总结(5)Memcached 的普通哈希分布和一致性哈希分布
    大数据价值挖掘:聚焦商业模式探索
    微博商业数据挖掘方法
    微博商业数据挖掘方法
    如何用大数据探索市场营销实践
    如何用大数据探索市场营销实践
    数据挖掘基本任务
    数据挖掘基本任务
    医疗大数据分析深入浅出
    医疗大数据分析深入浅出
  • 原文地址:https://www.cnblogs.com/codinglol/p/4727349.html
Copyright © 2011-2022 走看看