leetcode 链表类题目

13 篇文章 1 订阅

首先谈谈自己对于链表的理解,单链表由结点构成,每一个结点就是一个值加上一个指向其他位置的指针,重要的是这个指针,如果这个指针指向的还是一个结点,则无穷无尽,可以一直续下去。对于链表的操作实际上是对这个指针的操作。
一、链表相加
以下分析两链表数字相加,其中重要的地方是1、位数是否相等 2、是否为零 3、是否进位
代码如下:

#include<iostream>

using namespace std;


struct ListNode {
	int val;
	ListNode *next;
	ListNode(int x) : val(x), next(NULL) {}
};

ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
	ListNode * result=NULL;
	ListNode * point = NULL;
	if (l1 == NULL) return l2;
	if (l2 == NULL) return l1;
	int sum=0, jinwei=0;
	while (l1 != NULL || l2 != NULL||jinwei!=0)
	{
		int a = (l1 == NULL ? 0 : l1->val);
		int b = (l2 == NULL ? 0 : l2->val);
		sum = a + b + jinwei;

		ListNode *pm = new ListNode(sum % 10);
		jinwei = sum / 10;

		if (result== NULL)
		{
           result = pm; 
		   point = result;    //获取result指针
		}	   
		else
		{
			point->next = pm;    //在后面插入pm结点
			point = pm;         //获取pm指针
		}
		
		l1 = (l1==NULL?NULL:l1->next);
		l2 = (l2==NULL?NULL:l2->next);
	}
	return result;
}

void test()
{
	ListNode *p1 = new ListNode(2);
	ListNode *p2 = new ListNode(4);
	p1->next = p2;

	ListNode *p4 = new ListNode(5);
	ListNode *p5 = new ListNode(6);
	ListNode *p6 = new ListNode(4);
	p4->next = p5;
	p5->next = p6;

	ListNode *phead = addTwoNumbers(p1, p4);

	while (phead)
	{
		cout << phead->val << " ";
		phead = phead->next;
	}
}


int main()
{
	test();
	cout << endl<< "finish..." << endl;
	system("pause");
}

结果如图:
在这里插入图片描述
二、链表反转
链表反转可以创建新的链表,依次遍历原结点,然后将每次遍历中的结点插入到新的链表的前边去作为新的头结点。
以下为函数代码:

ListNode* reverse(ListNode *head)
{
	ListNode * reverse = NULL;
	ListNode * point = head;
	ListNode * temp;
	//遍历结点,头结点插入
	while (point!= NULL)
	{
		temp = point;
		point = point->next;
		temp->next = reverse;
		reverse = temp;
	}
	return reverse;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值