链表是一种物理存储单元上非连续、非顺序的存储结构数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。

单向链表

单向链表(单链表)是链表的一种,它由节点组成,每个节点都包含下一个节点的指针,下面Demo为单向列表的定义

双向链表

双向链表(双链表)是链表的一种。和单链表一样,双链表也是由节点组成,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

链表操作

1.从后面删除第N个节点

  1. func removeNthFromEnd(node:ListNode,n:Int) -> ListNode {
  2. if node.next == nil || n <= 0 {
  3. return node
  4. }
  5. let tempNode = ListNode(x:0)
  6. tempNode.next = node
  7. var p = tempNode,q = tempNode
  8. for _ in 0..<n {
  9. if p.next == nil {
  10. return tempNode
  11. }else{
  12. p = p.next ?? ListNode()
  13. }
  14. }
  15. p.showNode()
  16. while (p.next != nil) {
  17. p = p.next ?? ListNode()
  18. q = q.next ?? ListNode()
  19. }
  20. q.next = q.next?.next
  21. return tempNode.next ?? ListNode()
  22. }

2.从正面删除节点

  1. func removeNthFromNode(node:ListNode,n:Int) -> ListNode {
  2. if node.next == nil || n <= 0 {
  3. return node
  4. }
  5. var tempNode = node
  6. var nodeArr:[ListNode] = [node]
  7. while tempNode.next != nil {
  8. nodeArr.append(tempNode.next ?? ListNode())
  9. tempNode = tempNode.next ?? ListNode()
  10. }
  11. if nodeArr.count < n {
  12. return node
  13. }
  14. if n == 1 {
  15. //删除头
  16. return nodeArr[1]
  17. }
  18. if n == nodeArr.count {
  19. //删除尾
  20. let n:ListNode = nodeArr[n-1]
  21. n.next = nil
  22. return nodeArr[0]
  23. }
  24. let nodeNBefor = nodeArr[n-2]
  25. let nodeNAfter = nodeArr[n]
  26. nodeNBefor.next = nodeNAfter
  27. return nodeArr[0]
  28. }

3.单向链表定义Node

  1. class ListNode: NSObject {
  2. var val:Int = 0
  3. var next:ListNode?
  4. convenience init(x:Int) {
  5. self.init()
  6. self.val = x
  7. }
  8. func loadNode(arr:[Int]){
  9. if arr.count == 0 {
  10. return
  11. }
  12. self.val = arr[0]
  13. var cur = self
  14. for i in 1..<arr.count{
  15. cur.next = ListNode(x: arr[i])
  16. cur = cur.next ?? ListNode()
  17. }
  18. }
  19. func showNode() {
  20. var cur = self
  21. var res:String = ""
  22. while cur.next != nil {
  23. res.append(String.init(cur.val)+"->")
  24. cur = cur.next ?? ListNode()
  25. if cur.next == nil {
  26. res.append(String.init(cur.val)+"->")
  27. }
  28. }
  29. print(res)
  30. }
  31. }