题目:给你一个链表,两两交换其中相邻的结点,并返回交换后的链表的头结点。必须在不修改内部节点的值的情况下完成本题(即只能节点交换)
思路:交换节点和删除结点都需要新创建一个新结点newHead->head节点(因为要对head进行操作)
让1->next=2->next 2->next=1 newHead->next=2 之后循环下去
代码如下:
时间复杂度
O(n)
空间复杂度O(1)
/**
* 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 newHead = new ListNode(0); //建立一个新结点
newHead.next=head; //使新结点与头节点相连
ListNode p,q,w;
w=newHead; //新节点固定 用newHead代替指向新结点
p=head;
if(p==null){
return null;
}
if(p.next==null){
return p;
}
while(p!=null&&p.next!=null){
q=p.next;
p.next=q.next;
q.next=p;
newHead.next=q;
newHead=p; //移动newHead指向
p=p.next; //移动p的指向 这里q不用管 因为q始终 为 p->next
}
return w.next;
}
}