算法练习-3:两两交换链表中的节点

题目描述:两两交换其中相邻的节点,并返回交换后链表的头节点,只能通过交互节点而不是修改内部值来解决问题。

思路:使用三个指针,pre指针指向当前元素的前一个元素,cur指针指向当前元素,post指向下一个元素。一次通过对三个节点的next进行操作所以不需要考虑步长,因为每次交换next后,cur会到下一个位置(post的位置)从而迭代的cur.next就会到下一个位置(post的位置)的下一个位置,但是这样需要在head前再加一个补充节点。

算法练习-3:两两交换链表中的节点_第1张图片

同时需要对某位null进行结束条件判断。

代码:

/**
 * 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 headExp = new ListNode(0, head); // 在头结点前补充一个节点
        ListNode pre = headExp; // 记录pre节点
        ListNode cur = headExp.next; // 记录当前节点
        while(cur != null && cur.next != null){ // 判断条件,若没有判断cur.next则post节点会报错
            ListNode post = cur.next; // 记录post节点
            per.next = post; // 将pre节点的next连接至post节点
            cur.next = post.next; // 将cur节点的next连接至post节点的下一个节点
            post.next = cur; // 将post节点的next连接至cur节点
            per = cur; // 记录pre节点
            cur = cur.next; // 迭代
        }
        return headExp.next; // 返回
    }
}

你可能感兴趣的:(链表,数据结构)