For循环和while循环的区别:
for (表达式1;表达式2;表达式3)
在 for 循环的格式中,表达式 1、表达式 2 和表达式 3 在 while 循环中一个也不少,只不过不像 for 循环那样写在一起,而是分开写。在 while 循环中,循环变量 i 在定义的时候就给它赋初值,++i 则是写在 while 的循环体内。只有循环判断表达式与 for 一样,都是写在其后的括号中。
那么,是不是所有的 for 循环都可以转化成 while 循环?答案是“Yes”!不仅如此,所有的 while 循环也都可以转化成 for 循环,for 循环和 while 循环可以相互转换。
203.移除链表元素
1.删除头节点:head=head->next
加一个虚拟的头节点dummy head,来统一链表中的元素
再删除节点后,要做一个内存释放
2.链表中首先会进行定义
ListNode* removeElements(ListNode* head, int val) 这里面的head和val都可以直接用,都在头函数里进行了定义。
3.dummyhead->next=head;不要忘记赋值。
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* dummyHead= new ListNode(0);//设置一个虚拟头结点
dummyHead->next = head;// 将虚拟头结点指向head,这样方面后面做删除操作
ListNode* cur = dummyHead;
while(cur->next != NULL){
if(cur->next->val==val){
ListNode* tmp = cur->next;
cur->next = cur->next->next;
delete tmp;删除tep所在的节点位置;
}
else{
cur=cur->next;
}
}
head=dummyHead->next;
delete dummyHead;
return head;
}
};
707.设计链表
206.反转链表
思路:
1.首先定义一个cur指针,指向头结点,再定义一个pre指针,初始化为null。
在链表中,通常用双指针来操作指向性,将指向右边的箭头通过改变方向来指向左边,不用创建新链表,只需要改变指向性。
ListNode* temp;
ListNode* cur =head;
ListNode* pre= NULL;
2.然后就要开始反转了,首先要把 cur->next 节点用tmp指针保存一下,也就是保存一下这个节点。
为什么要保存一下这个节点呢,因为接下来要改变 cur->next 的指向了,将cur->next 指向pre ,此时已经反转了第一个节点了。
tmp的作用是cur和next指针中间的一个过渡。需要用三个指针来完成这项操作
3.接下来,就是循环走如下代码逻辑了,继续移动pre和cur指针。
最后,cur 指针已经指向了null,循环结束,链表也反转完毕了。 此时我们return pre指针就可以了,pre指针就指向了新的头结点。
在链表中,通常return到指针上,定义也是定义指针。
通常是三步走:1.定义 2.操作 3.循环
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* temp; // 保存cur的下一个节点
ListNode* cur =head;//把head的节点位置赋给cur
ListNode* pre= NULL;
while(cur){
temp = cur -> next;// 保存一下 cur的下一个节点,因为接下来要改变cur->next
cur -> next = pre;// 翻转操作
// 更新pre 和 cur指针
pre = cur;//把cur的节点位置赋给pre,原来cur指向的节点位置由pre指向
cur = temp;//把temp的节点位置赋给cur,原来temp指向的节点位置由cur指向。
//三个指针的作用是帮助指针不停地向右移动。
}
return pre;//返回pre节点位置,代表链表从pre所在的节点位置开始
}
};
注意指针的操作都是将右边指针的位置赋给左边的指针,这样在while(cur)中,cur作为一个判断条件,最后cur=cur->next 总会出现cur=NULL;的情况,从而结束循环体;