赞
踩
该题目源自LeetCode 024题。
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
有两个思路去解这道题
构建一个虚拟节点,然后看下面的图去写代码,就比较容易了。
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;
prev.next = head.next; //在第一次交换中,代表将虚拟节点的下一个,从指着头节点到指着头节点的下一个
head.next.next = head;//在第一次交换中,代表将头节点的下一个的指针指向头节点,也就是图中的2指向1
head.next = temp;//在第一次交换中,头节点指向图中的3
prev = head;//图中的1,原本的头节点成为下一次交换的prev
head = head.next;//原本头节点指向的节点,图中的3成为了新的头节点,然后继续循环下去,知道全部完成。
}
return dummyNode.next;
}
//递归的方法没有构建虚拟节点,但是也很好理解
public ListNode swapPairs2(ListNode head){
if (head == null || head.next == null)return head;
ListNode next = head.next;
ListNode newNode = swapPairs2(next.next);
next.next = head;// 第1次交换中,第二个节点指向第一个节点
head.next = newNode;//第一个节点指向后面的节点
return next;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。