翻转链表-迭代法

翻转链表,并不是创建新的链表结点然后在原链表上实现翻转!这一点一定要注意!

其实是修改原链表的指针,反过来指,就可以达到翻转链表的作用。见下图:

实现链表翻转有两个方法:1.迭代法;2.递归法。今天说一下第1种:迭代法

该方法是利用一个pre结点记录前驱结点,向下枚举,然后改变指针指向就可以。实现代码:

1. 链表的数据结构(C++):

struct ListNode
{
    int val; //结点存的数据值
    ListNode *next; //结点指针域
    ListNode(int x) : val(x), next(NULL) {}
};

2. Solution:

class Solution{
    public ListNode reverseList(ListNode head)
        {
        if(head == null || head.next == null)
            return head; //如果结点为NULL或单个结点就直接返回
            ListNode pre = head; //将pre指向头结点head
            ListNode cur = head->next; //将cur作为head结点的指针域指向的下一个结点
            while(cur != null)
            {
                ListNode next = cur->next; //将next作为cur结点的指针域指向的下一个结点循环
                cur->next = pre; //改变cur的指向,即反过来指
                pre = cur; //用pre表示cur 即pre下移一位
                cur = next; //用cur表示next 即cur下移一位
            } //循环 一直到cur指到最后 空为止

            head->next = null; //将原先结点的next置null防止最后成环
            ruturn pre;
          }
}

以上给的是一个Solution,不是可编译运行的代码。基本将算法和注释写明,或许很多朋友阅读还是觉得难以理解,下面我们附上图:

1. 初始化:设5个结点  val = 1, 2, 3, 4, 5

 2. 循环体

1) 第一次迭代

2) 第2次迭代

3)第3次迭代

4) 第4次迭代

第4次迭代之后,按照循环体第1步,next = cur-> next  此时next为空(null);第2步cur继续返指pre(即4号结点);第3步用pre表示cur(即结点5);第4步用cur表示next, 而此时next为null,所以   cur == null 退出循环体。

 3. 修改head

最后一步修改head的指针域为null。翻转链表完成!

最后再看一下图形:

这是正规图形,但是容易引起误解,所以都改成上图。记得做任何事情都要懂得分解,罗马不是一天建成的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值