从移动回来一个月,就一直在忙项目申请书的事情。通过写申请书,看新闻联播的新闻稿都开始顺眼了。
师兄师姐们已经开始找工作了,我还有一年时间,工作方面早作准备。机器学习方面继续推导常见的算法,刷一刷kaggle,做做特征工程什么的,算是应用了。
今天这道题其实并不难,但我是在Linux下写的,有些本地调试的方法和技巧想记录一下。
一、题目
Given a linked list, remove the nth node from the end of list and return its head.
For example,
Given linked list: 1->2->3->4->5, and n = 2. After removing the second node from the end, the linked list becomes 1->2->3->5.
Note:
Given n will always be valid.
Try to do this in one pass.
二、解析
一个链表,删除倒数第n个结点,最好用一次遍历的方法。
第一反应当然是遍历一遍链表,看一下长度是多少;然后再遍历链表,删除倒数第n个。
看到一次遍历后,就决定用空间换时间,开一个list存结点的地址,这样只需要在list里用两三步就能实现节点的删除
三、代码
1 # Definition for singly-linked list. 2 # class ListNode(object): 3 # def __init__(self, x): 4 # self.val = x 5 # self.next = None 6 7 class Solution(object): 8 def removeNthFromEnd(self, head, n): 9 """ 10 :type head: ListNode 11 :type n: int 12 :rtype: ListNode 13 """ 14 address = [] 15 while head: 16 address.append(head) 17 head = head.next 18 19 length = len(address) 20 if length == 0: 21 return address[0] 22 elif length == 1: 23 if n == 0: 24 return address[0] 25 elif n == 1: 26 return [] 27 else: 28 if n == 0: 29 return address[0] 30 elif length == n: 31 return address[1] 32 else: 33 target = address[length - n] 34 p = target.next 35 address[length - n - 1].next = p 36 del(address[length - n]) 37 return address[0]
四、收获
1.前两天装了CentOS,用VIM写这个程序。在本地调试的时候,遇到了麻烦,平时没怎么写过Class,突然一下就不会调试了。经过恪爷指导,通过零星的一点知识储备,最终还是搞定了。
程序结构应该是这样的:
1 ###########q19.py############### 2 Class ListNode(object): 3 def __init__(self, x): 4 self.val = x 5 self.next = None 6 7 Class Solution(object): 8 def removeNthFromEnd(self, head, n): 9 .... 10 return head 11 12 def main(self): 13 #不同类可以直接调用于声明对象 14 head = LinkList(2) 15 16 #在类中,调用同类方法要用self.function() 17 linklist = self.removeNthFromEnd(head, 3) 18 19 return linklist 20 21 sl = Solution() 22 sl.main() 23 24 ##############终端调试############ 25 import q19 26 sl = q19.Solution() 27 linklist = q19.main() 28 29 30 其实是不需要Solution中def main(),直接sl.removeNthFromEnd也是可以调用函数的,但是在main中还是要方便一些。
时间: 2024-10-16 00:15:25