程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

算法之单链表反转

发布于2019-08-06 19:19     阅读(1038)     评论(0)     点赞(2)     收藏(3)


醉了:算法题,不能丢啊,不能丢啊,吗的,我怎么觉得我越来越傻!!!

题目:单链表反转

单链表的概念熟记于心

  1. class Node<K>{    //真尴尬,java范型写的太少了
  2.                 private K val;
  3.                 public Node<K> next; 
  4. }

 

  1. class Node(object): #python版
  2.                def __init__(val,next):
  3.                      self.val = val
  4.                      self.next = next

 

特点:

a、头引用或者头结点指向第一个结点,然后最后一个结点指向null或None(Python中的null)

 

0、java解法(两种解法)

参考文章:https://www.cnblogs.com/keeya/p/9218352.html

两个思路:

a、从第一个结点一直向后开始变更引用 (从前往后)

b、从后面最后一个结点向前开始变更引用(递归)(从后往前)

  1. //第一种解法,从第一个结点,一直向右,直到最后一个结点
  2. private static Node reverseList(Node head) {
  3. Node pre = null;
  4. Node next;
  5. while (head != null) {
  6. next = head.next;
  7. head.next = pre;
  8. pre = head;
  9. head = next;
  10. }
  11. return pre;
  12. }
  13. …………代码语句执行过程分析…………
  14. 语句执行,pre赋值为null
  15. 语句执行,next赋值为null
  16. 第一轮循环,参与的是 1号、2号结点, 局部变量next先指向2号结点,1号结点的next指向null,最终当前的pre结点为1号结点,head赋值为2号结点
  17. 第二轮循环,参与的是 2号、3号结点, 局部变量next先指向3号结点,2号结点next指向1号结点,最终当前的pre结点为2号结点,head赋值为3号结点
  18. 第三轮循环,参与的是 3号结点、null结点, 局部变量next先指向null3号结点next指向2号结点,最终当前的pre结点为3号结点,head被赋值为null
  19. 第四轮循环,head为null,循环结束
  20. 语句执行,返回pre,此时pre的值是3号结点
  1. //第二种解法
  2. private static Node reverseListBySelf(Node head) {
  3. if (head == null || head.next == null)
  4. return head;
  5. Node temp = head.next;
  6. Node newHead = reverseListBySelf(head.next);
  7. temp.next = head;
  8. head.next = null;
  9. return newHead;
  10. }
  11. …………方法调用栈过程…………
  12. 第三次reverseListBySelf,传入结点为3号结点
  13. 语句执行,if判断为true,因为3号结点的next为null
  14. 语句执行,return传入的3号结点
  15. 第二次reverseListBySelf,传入结点为2号结点
  16. 语句执行,if判断为false
  17. 语句执行,temp为3号结点
  18. 语句执行,newHead,再去执行reverseListBySelf方法,传入的是3号结点,等待newHead指向3号结点
  19. 语句执行,temp3号结点next指向2号结点
  20. 语句执行,当前head2号结点的next指向到了null
  21. 语句执行,return newHead为3号结点
  22. 第一次reverseListBySelf,传入结点为1号结点
  23. 语句执行,if判断为false
  24. 语句执行,temp为2号结点
  25. 语句执行,newHead,去执行reverseListBySelf方法,传入的是2号结点,newHead拿到了第二次的返回值了,newHead同样指向3号结点
  26. 语句执行,2号结点指向1号结点
  27. 语句执行,1号结点指向null
  28. 语句执行,return newHead为3号结点
  29. main方法开始

 

 

1、python解法(用到连续赋值)

假如要对一个链表进行翻转,就比如把1—>2->3->4转化为4->3->2->1

对于这个问题很简单,只要反转指针就可以了,假如链表结构为:

class ListNode:
    def __init__(self, x):
        self.val = x
        self.next = None

我们可以用很简单的三行代码完成这个过程:

def reverseList(self, head):
        L = ListNode(float("-inf"))
        while head:
            L.next, head.next, head = head, L.next, head.next
        return L.next

 

 



所属网站分类: 技术文章 > 博客

作者:sdhjsdh

链接:https://www.pythonheidong.com/blog/article/9339/74fbb1c7f72dfb5701c7/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

2 0
收藏该文
已收藏

评论内容:(最多支持255个字符)