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

    题目:

    翻转一个链表

    样例

    给出一个链表1->2->3->null,这个翻转后的链表为3->2->1->null

    挑战

    在原地一次翻转完成

    解题:

    递归还是可以解的

    java程序:

    /**
     * Definition for ListNode.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int val) {
     *         this.val = val;
     *         this.next = null;
     *     }
     * }
     */ 
    public class Solution {
        /**
         * @param head: The head of linked list.
         * @return: The new head of reversed linked list.
         */
        public ListNode reverse(ListNode head) {
            // write your code here
            if( head ==null || head.next ==null)
                return head;
            ListNode  second = head.next;
            head.next = null;
            ListNode res = reverse(second);
            second.next = head;
            return res;
        }
    }
    View Code

    总耗时: 2079 ms

    Python程序:

    """
    Definition of ListNode
    
    class ListNode(object):
    
        def __init__(self, val, next=None):
            self.val = val
            self.next = next
    """
    class Solution:
        """
        @param head: The first node of the linked list.
        @return: You should return the head of the reversed linked list. 
                      Reverse it in-place.
        """
        def reverse(self, head):
            # write your code here
            if head == None or head.next == None:
                return head 
            second = head.next;
            head.next = None 
            res = self.reverse(second)
            second.next = head
            return res
    View Code

    总耗时: 265 ms

     非递归参考于剑指OfferP113

    定义三个节点:

    revHead翻转后的头节点

    p向前走的节点

    prev要插入节点的前一个节点,同时在循环中还有一个节点pNext临时保存p的下一个节点

    初始值:p=head,prev = null,revHead = null

    在循环中:

    先pNext = p.next 临时保存p的下一个节点,防止链表锻炼

    p.next = prev p的下一个节点直线prev节点,就是翻转,链接到其前面的一个节点,为了保持每次都能这样链接

    prev = p  prev节点向后移动一个节点

    最后p = pNext 循环下去

    同时要找到链表的头节点

    当pNext==null的时候 revHead = p p就是头节点,其实运行结束时候的prev节点就是指向头节点的,单独搞个头节点,看着舒服点

    /**
     * Definition for ListNode.
     * public class ListNode {
     *     int val;
     *     ListNode next;
     *     ListNode(int val) {
     *         this.val = val;
     *         this.next = null;
     *     }
     * }
     */ 
    public class Solution {
        /**
         * @param head: The head of linked list.
         * @return: The new head of reversed linked list.
         */
        public ListNode reverse(ListNode head) {
            // write your code here
            ListNode revHead = null;
            ListNode p = head;
            ListNode prev = null;
            while(p!=null){
                ListNode pNext = p.next;
                if(pNext == null){
                    // 翻转后的头节点,后面是空,结果
                    revHead = p;
                }
                // p的下一个节点指向之前要链接的节点
                p.next = prev;
                // 要链接的节点 直线p节点,以供下次链接
                prev = p;
                // p节点更新,指向pNext
                p = pNext;
            }
            return revHead;
        }
    }
    Java Code

    总耗时: 1325 ms

    """
    Definition of ListNode
    
    class ListNode(object):
    
        def __init__(self, val, next=None):
            self.val = val
            self.next = next
    """
    class Solution:
        """
        @param head: The first node of the linked list.
        @return: You should return the head of the reversed linked list. 
                      Reverse it in-place.
        """
        def reverse(self, head):
            # write your code here
            p = head 
            prev = None
            revHead = None
            while p!=None:
                pNext = p.next
                if pNext ==None:
                    revHead = p
                p.next = prev
                prev = p
                p = pNext
            return revHead
    Python Code

    总耗时: 223 ms

  • 相关阅读:
    [loj2706]文本编辑器
    [atAGC053C]Random Card Game
    [atAGC056E]Cheese
    [cf1615G]Maximum Adjacent Pairs
    [cf739D]Recover a functional graph
    [uoj693]地铁规划
    [atAGC053E]More Peaks More Fun
    [atAGC056B]Range Argmax
    [atAGC056F]Degree Sequence in DFS Order
    SceneGrabber NET 视频批量自动截图软件使用技巧
  • 原文地址:https://www.cnblogs.com/bbbblog/p/4889710.html
Copyright © 2011-2022 走看看