24. 两两交换链表中的节点
要注意: 指针要指向要反转两个节点的前一个节点; 此外针对指针长度为偶数还是奇数的情况要判断下; 另外需要两个变量存变化之前的第一个结点的previous节点,以及第二个节点的next节点,因为反转后那两个节点之前的指向就找不到了
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode *dummy = new ListNode(-1);
dummy->next = head;
ListNode *current =dummy; // current 指针必须指向要反转两个节点的前一个节点
while(current->next != NULL && current->next->next != NULL ){ //遍历结束条件:如果链表为偶数,那么current-next为null结束,如果链表为基数,那么current-next-next为null结束;空链表也是按照偶数执行;需要同时保证两个不为空才能进行操作
ListNode *temp = current->next; //保持第一个结点的previous节点,因为之后这条节点会断;
ListNode *temp1 =current->next->next->next;//保持第二个结点的next节点,因为之后这条节点会断;
current->next = current->next->next; //注意指针移位操作与指针next指向操作的区别
current->next->next=temp;
temp->next=temp1;
current = current->next->next;
}
return dummy->next;
}
};
19.删除链表的倒数第N个节点
第一种解法
自己写的: 遍历下链表数出来链表长度, 然后令index = length - n; 然后再次遍历链表到index的位置; 注意删除链表节点的题目都需要把指针停在要删除的节点的前一个节点;
另外由于要将current-next 指向current->next->next; 要时刻注意自己会不会操作到了空指针;可以指向空指针,但是不能对空指针取next; 所以条件判断语句中都要检查一下这个;
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummy = new ListNode(-1);
dummy->next =head;
ListNode *current = dummy;
ListNode *current1 = dummy;
int count =0;
while(current->next!=NULL)
{
current = current -> next;
count++;
}
int index = count-n;
while((index>0) && current1!=NULL) { //current!=null
current1 = current1 -> next;
index--;
}
if(current1->next!=NULL)
current1 ->next = current1-> next->next;
return dummy->next;
}
};
第二种解法快慢指针
这种解法的核心是定义两个指针,一个快指针一个慢指针;先让快指针先遍历到n+1的位置, 然后在让快慢指针同时往前走, 当指针指向链表结尾的null的时候,慢指针刚好指向需要删除节点的前一个节点; 之所以要染快指针走到n+1的位置而不是n,是为了access到要删除指针的前一个指针;
160: 指针相交
这个题要注意理解题意;差不多就是leetcode会创造一个Y 形状的链表,然后让你判断出分叉在哪个节点; 尤其要注意是判断指针相等 (意思是指针指向的地址相等),而不是比较节点的value相等;注意下判断不是空指针的条件就可以;
while(curA != NULL) {
//注意这时候不能操控curA 当curA为空指针时
curA = curA->next;
lenA++;
}
142.环形链表II
这个题要使用fast and slow指针,要看一下相遇条件以及相遇的地方数学计算