Day3.203.移除链表元素 & 707.设计链表 & 206.反转链表

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.移除链表元素

203. 移除链表元素 - 力扣(LeetCode)

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.设计链表

707. 设计链表 - 力扣(LeetCode)

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;的情况,从而结束循环体; 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值