单链表-删除单链表L中奇数号节点(双指针法)

题意:
有一个带头节点的单链表L,设计一个算法,删除其中第1,3,5,7号…节点,即删除奇数号的节点。

单链表的存储结构:

typedef struct LinkList{
        int data;
        LinkList * next;
    }

分析:
要删除肯定要定义两个指针pre,p,但是这里是删除奇数号节点,也就是说,要隔一个才删除。
以往后移操作都是,p=p->next
但是,这是p指向的节点的删除了。free(q),这里就不能用这个了, 但是可以用前驱节点pre,pre = pre->next;
这个操作后移之后,再p = pre ->next;即可

思路:

1.定义两个指针pre,p
2.通过while循环,条件为p!=null;
将p指向的第一个节点删除,pre->next =p->next;free§;
后移pre=pre->next;
再判断,如果pre为空,则结束;否则p = pre->next;

C代码实现:

  void delodd(LinkList *&L){
        LinkList *pre = L,*P = pre->next;
        while(p!=null){
            pre->next = p->next;  //首先删除第一个结点
            free(p);
            pre = pre->next;
            p = pre->next;
    }
计算1到100中奇数和偶数的和有多种方法,以下是不同的实现方式: ### 使用while循环【方法二】 ```cpp #include<iostream> using namespace std; int main(){ int i=2,j=1,sum1=0,sum2=0; while(i<=100) { sum1=sum1+i; sum2=sum2+j; i=i+2; j=j+2; } cout<<"sum1="<<sum1<<" sum2="<<sum2; return 0; } ``` 此方法通过`while`循环,分别用`i`遍历偶数、`j`遍历奇数,同时累加求和[^1]。 ### 使用for循环【方法二】 ```cpp #include<iostream> using namespace std; int main(){ int sum1=0,sum2=0; for(int i=1;i<=100;i++) { if(i%2==0) sum1=sum1+i; else sum2=sum2+i; } cout<<"sum1="<<sum1<<" sum2="<<sum2; return 0; } ``` 该方法利用`for`循环遍历1到100的所有数,通过取模运算判断奇偶性,再分别累加求和[^2]。 ### 另一种for循环实现 ```cpp #include <iostream> using namespace std; int main() { int oddSum = 0; int evenSum = 0; for (int i = 1; i <= 100; i++) { if (i % 2 == 1) { oddSum += i; } else { evenSum += i; } } cout << oddSum << " " << evenSum << endl; return 0; } ``` 同样是`for`循环,判断每个数的奇偶性后分别累加到对应的和中,最后输出结果[^3]。 ### 再一种for循环实现 ```cpp #include <iostream> using namespace std; int main() { int jssum = 0; int ossum = 0; for (int js = 1, os = 2; js <= 99 && os <= 100; js += 2, os += 2) { jssum += js; ossum += os; } cout << "奇数和:" << jssum << endl; cout << "偶数和:" << ossum << endl; return 0; } ``` 此`for`循环同时对奇数和偶数进行遍历并累加求和,最后输出奇数和与偶数和[^4]。 ### 使用for循环【方法一】 ```cpp #include<iostream> using namespace std; int main(){ int sum1=0,sum2=0; for(int i=2,j=1;i<=100;i=i+2,j=j+2) { sum1=sum1+i; sum2=sum2+j; } cout<<"sum1="<<sum1<<" sum2="<<sum2; return 0; } ``` 该`for`循环分别用`i`和`j`遍历偶数和奇数,同时进行累加求和,最后输出结果[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值