zoukankan      html  css  js  c++  java
  • 剑指offer-反转链表

    题目描述

      输入一个链表,反转链表后,输出链表的所有元素。
     

    代码思路

      要反转链表即要把每个节点的next指针反转,考虑下面的链表:

    1 -> 2 -> 3 -> 4

      第一次反转时若把2的next指针直接指向1,则会出现下列情况:

    1 <- 2   3 -> 4

      接下来再往下便访问不到3于是无法完成反转。所以完成当前反转之前,要先保存当前结点的下一个节点。具体来说可以设置三个指针来实现:pPre指向要调整next指针的前一个节点,pHead为当前要反转的节点,pAfter为pHead的下一个节点。操作如下:

     1    <-   2        3   ->   4
    pPre     pHead    pAfter

      这样每次反转前,先保存当前结点的下一个节点,然后调整当前结点的next指针使其指向pPre,这样遍历下去直到pAfter为NULL,此时已反转完整个链表,并且pHead也指向了原链表的末尾也就是新链表的头结点。

      注意在反转前要判断pPre是否为NULL,如果为NULL说明是第一次反转,那么需要把当前结点也就是链表头结点的next指针指向NULL。

    代码

     1 /*
     2 struct ListNode {
     3     int val;
     4     struct ListNode *next;
     5     ListNode(int x) :
     6             val(x), next(NULL) {
     7     }
     8 };*/
     9 class Solution {
    10 public:
    11     ListNode* ReverseList(ListNode* pHead) {
    12         if(pHead == NULL)
    13             return NULL;
    14         ListNode* pPre = NULL;
    15         ListNode* pAfter = NULL;
    16         if(pHead->next)
    17             pAfter = pHead->next;
    18         while(pAfter){
    19             if(pPre == NULL)
    20                 pHead->next = NULL;
    21             pPre = pHead;
    22             pHead = pAfter;
    23             pAfter = pHead->next;
    24             pHead->next = pPre;
    25         }
    26         return pHead;
    27     }
    28 };
  • 相关阅读:
    如何将DataTable转换成List<T>
    关于SqlDataAdapter的使用
    VS 2010中JS代码折叠插件
    ASP.net中的几种分页方法
    学习jquery基础教程的一些笔记
    js中innerHTML与innerText的用法与区别
    SpringBoot 中使用shiro注解使之生效
    redis分布式锁
    使用ZSetOperations(有序)操作redis
    使用SetOperations(无序)操作redis
  • 原文地址:https://www.cnblogs.com/wmx24/p/8734468.html
Copyright © 2011-2022 走看看