1.题目描述
2.题解
想说的都在图里了。
3.代码示例
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode swapPairs(ListNode head) {
//创建要用到的三个指针
ListNode i=new ListNode();
ListNode j=new ListNode();
ListNode index=new ListNode();
//若链表为空或只有一个元素则返回其本身
if(head==null||head.next==null)
return head;
i=head;//i指向第一个元素
j=head.next;//j指向第二个元素
head=j;//最终的head肯定是指向第二个元素
index=i;
while(true){
i.next=j.next;//第一步
j.next=i;//第二布
i=index.next;//第三步
//若链表有奇数个且遍历到最后一个则直接结束循环
if(i==null||i.next==null)
break;
j=i.next;//第四步
index.next=j;//第五步
index=i;//第六步
}
return head;
}
}
4.问题总结
i.当链表有奇数个时
判断前一个指针(即 i )的next是否为空,若为空则遍历到最后一个元素,直接结束循环即可。
ii.以上判断操作中要加上一个对 i 是否为空的判断,是为了避免空指针的异常,否则会报错。