代码随想录算法训练营第三天| 203.移除链表元素 707.设计链表 206.反转链表

力扣203

代码随想录题解

移除链表元素是我早期刷题接触到的题目,当时对链表这个数据结构不是很熟悉,很多方法都是硬背下来的。但是在回过头来看,现在的理解清晰了许多,将链表的索引与数组的索引进行类比理解,他们有相通之处也有不同的地方。这样对链表的处理就清晰了很多。所以还是要多练才行呀。

移除链表元素,可以用虚节点作为头结点,这样就避免了第一个元素移除时,要重新创建头结点的过程。代码如下所示:

  1. class Solution(object):
  2. def removeElements(self, head, val):
  3. dummyhead = ListNode(0)
  4. dummyhead.next = head
  5. cur = dummyhead
  6. while cur.next:
  7. if cur.next.val == val:
  8. cur.next = cur.next.next
  9. else:
  10. cur = cur.next
  11. return dummyhead.next

力扣206

代码随想录题解

先讲反转链表

反转链表是很容易出错的一个题,也是我实习面试的时候遇到过的题目,所以印象十分深刻。

首先的要点就是,先链接上前一个元素,再断开与后一个元素的链接。所以需要两个指针,一个指向当前节点,一个指向前一个节点。

想清楚这件事,代码就不难了:

  1. class Solution(object):
  2. def reverseList(self, head):
  3. """
  4. :type head: ListNode
  5. :rtype: ListNode
  6. """
  7. # if (head == None or head.next == None):
  8. # return head
  9. # cur = self.reverseList(head.next)
  10. # head.next.next = head
  11. # head.next = None
  12. # return cur
  13. pre, cur = None, head
  14. temp = None
  15. while cur:
  16. temp = cur.next#临时存
  17. cur.next = pre#反转
  18. pre = cur#pre移到反转前的下一站
  19. cur = temp#cur移到反转前的下一站
  20. return pre

注释里面是递归法,思路是一样的

力扣707 设计链表

代码随想录题解

这里面主要是需要熟悉链表的一些方法的使用,代码如下:

  1. class ListNode:
  2. def __init__(self, val=0, next=None):
  3. self.val = val
  4. self.next = next
  5. class MyLinkedList(object):
  6. def __init__(self):
  7. self.dummy_head = ListNode()##添加虚拟头结点,便于删除和添加链表节点
  8. self.size = 0
  9. def get(self, index):
  10. if index < 0 or index >= self.size:##判断下标是否越界
  11. return -1
  12. current = self.dummy_head.next
  13. for i in range(index):
  14. current = current.next
  15. return current.val
  16. def addAtHead(self, val):
  17. self.dummy_head.next = ListNode(val, self.dummy_head.next)
  18. self.size += 1
  19. def addAtTail(self, val):
  20. current = self.dummy_head
  21. while current.next:
  22. current = current.next##通过循环读取到最后个节点
  23. current.next = ListNode(val)
  24. self.size += 1
  25. def addAtIndex(self, index, val):
  26. if index < 0 or index > self.size:
  27. return
  28. current = self.dummy_head
  29. for i in range(index):
  30. current = current.next##通过循环读取到第index+1个节点
  31. current.next = ListNode(val, current.next)
  32. self.size += 1
  33. def deleteAtIndex(self, index):
  34. if index < 0 or index >= self.size:
  35. return
  36. current = self.dummy_head
  37. for i in range(index):
  38. current = current.next
  39. current.next = current.next.next
  40. self.size -= 1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

举报

选择你想要举报的内容(必选)
  • 内容涉黄
  • 政治相关
  • 内容抄袭
  • 涉嫌广告
  • 内容侵权
  • 侮辱谩骂
  • 样式问题
  • 其他
点击体验
DeepSeekR1满血版
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回顶部

登录后您可以享受以下权益:

×