零、前言
从这篇文章开始刷 写给前端的算法进阶指南,我是如何两个月零基础刷200题
一、题目描述:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[] 示例 3:
输入:head = [1] 输出:[1]
提示 :
链表中节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100
进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)
二、思路分析
主要还是考察链表的基础操作。
拿到题的第一刻还有点蒙,算法题刷的不多,前年开始系统接触算法,比较少刷。拿到题目描述在想,我靠这么简单,这一个数组直接遍历一下,隔一个交换下下标对应内容。结果代码里给的是链表的数据结构。
1·主要是交换节点,
dummyNode -> node1 -> node2
node1.next=node1.next.next;
node2.next=node1;
dummyNode.next=node2;
2·while循环结束标志
temp为每次需要交换节点的前一个,所以只要temp.next或temp.next.next一个为空就结束循环。刚开始的时候我直接写 while(temp.next===null || temp.next.next === null) 所以老是调试不对。
三、AC代码
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function (head) {
if (head === null || head.next == null) {
return head
}
var dummyHead = new ListNode(0);
dummyHead.next = head;
var temp = dummyHead;
while (temp.next != null && temp.next.next !== null) {
var node1 = temp.next;
var node2 = temp.next.next;
node1.next = node2.next;
node2.next = node1;
temp.next = node2;
temp = node1;
}
return dummyHead.next
**};**