Day15:反转链表

时间:2022-07-24
本文章向大家介绍Day15:反转链表,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

剑指Offer_编程题——反转链表

题目描述:

输入一个链表,反转链表后,输出新链表的表头。

具体要求:

时间限制: C/C++ 1秒,其他语言2秒 空间限制: C/C++32M,其他语言64M

具体思路:

背景知识介绍   在做本题之前首先介绍一下链表的基本知识。在维基百科中,链表 是这样定义的:链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而顺序表相应的时间复杂度分别是O(logn)和O(1)。一个链表如图所示:

  链表的基本元素有:节点:每个节点有两个部分,左边部分称为值域,用来存放用户数据;右边部分称为指针域,用来存放指向下一个元素的指针。head:head节点永远指向第一个节点;tail: tail永远指向最后一个节点;None:链表中最后一个节点的指针域为None值。 具体解题思路:   既然我们知道了链表相关的基本知识,那么要做到反转链表,我们应该将前一个节点与后一个节点断开,然后让前一个节点指向后一个节点,这个过程我们需要用到节点的引用来确定记录当前节点的前一个节点和后一个节点。这个思路的具体用java代码实现如下:

public class Solution{
	public ListNode ReverseList(ListNode head){
	    if(head == null)
	    	return null;
	    ListNode pre = null;
	    ListNode next = null;
	    while(head != null){
	    	next = head.next;
	    	head.next = pre;
	    	pre = head;
	    	head = next;
	    }
	    	return pre;
	}
}

代码效果图如图所示:

  正如上一篇提到一样,牛客网已经为我们定义了节点,不需要我们重复定义,但是在自己的本地编译器中,我们需要定义节点ListNode的类,具体实现如下:

public class ListNide{
	int val;
	ListNode next = null;
	ListNode(int val){
		this.val = val;
	}
}

当然我们也可以用python来实现上面这一思路:

class Solution:
    # 返回ListNode
    def ReverseList(self, pHead):
        # write code here
        if not pHead or not pHead.next:
            return pHead
        last = None
        while pHead:
            tmp = pHead.next
            pHead.next = last
            last = pHead
            pHead = tmp
        return last

代码效果图如图所示:

用python定义的节点如下:

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

总结

  本道题主要考察链表的反转,在做此题之前我们应该了解链表的基本知识,再次基础上用多种自己掌握的语言实现它,力求做到融会贯通,其实这道题的难点在于如何用代码实现链表节点的断裂以及要保存前一个节点和后一个节点在断裂之前。另外我们用python语言实现时,如果直接用list[:: -1]就不太方便。总之,继续加油,争取早日找到工作,Good Luck!!!

参考文献

  本文的代码主要参考以下文章: [1] 维基百科·链表 [2] flyingsen [3] 试着去听歌 [4] 黄小猿