欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode 24. Swap Nodes in Pairs

程序员文章站 2022-07-14 08:26:15
...

题目

Given a linked list, swap every two adjacent nodes and return its head.
You may not modify the values in the list’s nodes, only nodes itself may be changed.

Example:
Given 1->2->3->4, you should return the list as 2->1->4->3.

LeetCode 24. Swap Nodes in Pairs
起码要有两个指针记录节点本身的位置,比如想要交换3,4:
这时肯定需要一个指针指向需要交换的节点3的上一个节点–2(pre所指的位置),这样才能跟后面的节点连上。
节点3 指向-> 节点5时;即:pre.next.next = p.next;3,4的连接就断开了,此时节点4的位置也需要记录(p)
对应的交换过程为:

	pre.next.next = p.next;
	p.next = pre.next;
	pre.next = p;
	pre = p.next;
        	

注意: 交换完后p的相对位置也改变了。
LeetCode 24. Swap Nodes in Pairs

因为pre指向的是交换的两个节点的前一个,所以当交换1,2时,可以在一开始单独交换一次。
LeetCode 24. Swap Nodes in Pairs
pre指向的是交换的两个节点的前一个节点,所以只要pre后面还有节点,就可以继续循环,继续交换。
**注意:**交换1,2后,头节点也变了。
交换1,2后,让pre指向下一次交换的前一个节点p = head.next
循环里需要首先让p指向下一个需要交换的两个节点。

		p = pre.next;
      	if(p.next == null) { 如果pre后面之后一个节点那就不用交换了
      		break;
      	}else {
      		p = p.next;
      	}

pre继续指向下一个要交换的前一个节点,即pre = p.next

JAVA代码

public ListNode swapPairs(ListNode head) {
		if(head == null || head.next == null) return head;
        ListNode pre, p;
        pre = head;
        p = head.next;
        pre.next = p.next;
    	p.next = pre;
    	head = p;
        while(pre.next != null) {
        	p = pre.next;
        	if(p.next == null) {
        		break;
        	}else {
        		p = p.next;
        	}
        	pre.next.next = p.next;
        	p.next = pre.next;
        	pre.next = p;
        	pre = p.next;
        }
		return head;
    }