zoukankan      html  css  js  c++  java
  • LeetCode——206. 反转链表

    反转一个单链表。

    示例:

    输入: 1->2->3->4->5->NULL
    输出: 5->4->3->2->1->NULL
    

    进阶:
    你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

    https://leetcode-cn.com/problems/reverse-linked-list/

    迭代

    思路是在原链表之前建立一个空的newHead,因为首节点会变,然后从head开始,将之后的一个节点移到newHead之后,重复此操作直到head成为末节点为止,代码如下:

    c++

    lass Solution {
    public:
        ListNode* reverseList(ListNode* head) {
            ListNode *newHead = NULL;
            while (head) {
                ListNode *t = head->next;
                head->next = newHead;
                newHead = head;
                head = t;
            }
            return newHead;
        }
    };
    

    java

    class Solution {
    	public ListNode reverseList(ListNode head) {
    		//申请节点,pre和 newHead,pre指向null
    		ListNode pre = null;
    		ListNode newHead = head;
    		ListNode tmp = null;
    		while(newHead!=null) {
    			//记录当前节点的下一个节点
    			tmp = newHead.next;
    			//然后将当前节点指向pre
    			newHead.next = pre;
    			//pre和newHead节点都前进一位
    			pre = newHead;
    			newHead = tmp;
    		}
    		return pre;
    	}
    }
    

    python

    class Solution(object):
    	def reverseList(self, head):
    		# 申请两个节点,pre和 newHead,pre指向None
    		pre = None
    		newHead = head
    		# 遍历链表,while循环里面的内容其实可以写成一行
    		# 这里只做演示,就不搞那么骚气的写法了
    		while newHead:
    			# 记录当前节点的下一个节点
    			tmp = newHead.next
    			# 然后将当前节点指向pre
    			newHead.next = pre
    			# pre和newHead节点都前进一位
    			pre = newHead
    			newHead = tmp
    		return pre	
    

    递归

    递归解法的思路是,不断的进入递归函数,直到head指向倒数第二个节点,因为head指向空或者是最后一个结点都直接返回了,

    newHead则指向对head的下一个结点调用递归函数返回的头结点,此时newHead指向最后一个结点,然后head的下一个结点的next指向head本身,这个相当于把head结点移动到末尾的操作,

    因为是回溯的操作,所以head的下一个结点总是在上一轮被移动到末尾了,但head之后的next还没有断开,所以可以顺势将head移动到末尾,再把next断开,最后返回newHead即可,代码如下:

    c++

    class Solution {
    public:
        ListNode* reverseList(ListNode* head) {
            if (!head || !head->next) return head;
            ListNode *newHead = reverseList(head->next);
            head->next->next = head;
            head->next = NULL;
            return newHead;
        }
    };
    

    java

    class Solution {
    	public ListNode reverseList(ListNode head) {
    		//递归终止条件是当前为空,或者下一个节点为空
    		if(head==null || head.next==null) {
    			return head;
    		}
    		//这里的newHead就是最后一个节点
    		ListNode newHead = reverseList(head.next);
    		//如果链表是 1->2->3->4->5,那么此时的newHead就是5
    		//而head是4,head的下一个是5,下下一个是空
    		//所以head.next.next 就是5->4
    		head.next.next = head;
    		//防止链表循环,需要将head.next设置为空
    		head.next = null;
    		//每层递归函数都返回newHead,也就是最后一个节点
    		return newHead;
    	}
    }
    

    python

    class Solution(object):
    	def reverseList(self, head):
    		# 递归终止条件是当前为空,或者下一个节点为空
    		if(head==None or head.next==None):
    			return head
    		# 这里的newHead就是最后一个节点
    		newHead = self.reverseList(head.next)
    		head.next.next = head
    		# 防止链表循环,需要将head.next设置为空
    		head.next = None
    		# 每层递归函数都返回newHead,也就是最后一个节点
    		return newHead
    
  • 相关阅读:
    图论——拓扑排序
    BZOJ 2882 & 后缀数组的傻逼实现
    BZOJ 2626 & KDtree
    Colorado Potato Beetle(CF的某道) & 鬼畜宽搜
    Prime & 反素数plus
    BZOJ 2049 & LCT又一模板
    BZOJ2002 & LCT模板(分块不会搞)
    BZOJ2190 & 欧拉函数
    BZOJ 1053 & 反素数
    POJ2774 & 后缀数组模板题
  • 原文地址:https://www.cnblogs.com/wwj99/p/12394742.html
Copyright © 2011-2022 走看看