首先谈谈自己对于链表的理解,单链表由结点构成,每一个结点就是一个值加上一个指向其他位置的指针,重要的是这个指针,如果这个指针指向的还是一个结点,则无穷无尽,可以一直续下去。对于链表的操作实际上是对这个指针的操作。
一、链表相加
以下分析两链表数字相加,其中重要的地方是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;
}