LEETCOODE--24题两两交换链表中的节点的不同使用方式
class Solution {//java方式
public ListNode swapPairs(ListNode head) {
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode prevNode = dummy;
while ((head != null) && (head.next != null)) {
ListNode firstNode = head;
ListNode secondNode = head.next;
prevNode.next = secondNode;
firstNode.next = secondNode.next;
secondNode.next = firstNode;
prevNode = firstNode;
head = firstNode.next; // jump
}
return dummy.next;
}
}
class Solution {//C方式
public:
ListNode* swapPairs(ListNode* head){
ListNode* dummyHead= new ListNode(0);
dummyHead->next = head;
ListNode* p = dummyHead;
while(p->next && p->next->next)
{
ListNode* node1 = p->next;
ListNode* node2 = node1->next;
ListNode* next = node2->next;
node2->next = node1; //然后改变2的next指针指向1
node1->next = next;//然后改变1的next指针指向3。
p->next = node2;//将per前的链表连接到 完成交换的链表
p = node1;//更新per
}
ListNode* retNode = dummyHead->next;
delete dummyHead
return retNode;
}
}
1.ListNode dummy = new ListNode(-1); 等价于ListNode* dummyHead= new ListNode(0);
有点python的感觉,-1作为整一个数组的虚拟点=对第一点的双空指引。
2.dummy.next = head;等价于 dummyHead->next = head;
.等价于->
3.ListNode prevNode = dummy;等价于 ListNode* p = dummyHead;
C语言的更加好理解,创建指针,而Java通过前一个节点的属性是后一个节点的值,创建索引来给dummy加个标志。
4.while ((head != null) && (head.next != null)) 等价于 while(p->next && p->next->next)
都是头指针指向不为空,且后一个(头指针要移下去的对象)也不为空。
5.ListNode firstNode = head;ListNode secondNode = head.next;等价于 ListNode* node1 = p->next(dummyHead);ListNode* node2 = node1->next; ListNode* next = node2->next;
就是声明了第一个头节点的e是firstNode ,后一个是secondNode等价于声明了第一个是node1,后一个是node2,node2的后一是next
secondNode.next = firstNode; node2->next = node1; //然后改变2的next指针指向1
firstNode.next = secondNode.next; node1->next = next;//然后改变1的next指针指向3。
prevNode.next = secondNode; p->next = node2;//将per前的链表连接到 完成交换的链表
prevNode = firstNode; p = node1;//更新per
head = firstNode.next; // jump
指针往后一位,head是调换元素中第一个元素的位置,同样往后
后面返回数据一样