LeetCode链表问题——24.两两交换链表中的结点(一题一文学会链表)

一、题目描述: 

24. 两两交换链表中的节点

难度中等1478收藏分享切换为英文接收动态反馈

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

  

二、代码 

class Solution {
  public ListNode swapPairs(ListNode head) {

    ListNode dummyNode = new ListNode(0);
    dummyNode.next = head;
    ListNode prev = dummyNode;

    while (prev.next != null && prev.next.next != null) {
      ListNode temp = head.next.next; // 缓存 next
      prev.next = head.next;          // 将 prev 的 next 改为 head 的 next
      head.next.next = head;          // 将 head.next(prev.next) 的next,指向 head
      head.next = temp;               // 将head 的 next 接上缓存的temp
      prev = head;                    // 步进1位
      head = head.next;               // 步进1位
    }
    return dummyNode.next;
  }
}

三、了解链表

什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。链接的入口节点称为链表的头结点也就是head。

 单链表:链表1

双链表:

每一个节点有两个指针域,一个指向下一个节点,一个指向上一个节点。

双链表 既可以向前查询也可以向后查询。

链表2

循环链表: 

循环链表,顾名思义,就是链表首尾相连。循环链表可以用来解决约瑟夫环问题。

链表4

 链表的存储方式:

数组是在内存中是连续分布的,但是链表在内存中可不是连续分布的。

链表是通过指针域的指针链接在内存中各个节点。

所以链表中的节点在内存中不是连续分布的 ,而是散乱分布在内存中的某地址上,分配机制取决于操作系统的内存管理。

删除节点:

只要将C节点的next指针 指向E节点就可以了。

链表-删除节点

添加节点: 

 链表-添加节点

与数组对比: 

链表-链表与数据性能对比

猜你喜欢

转载自blog.csdn.net/w20001118/article/details/125986739