题目讲解:
力扣
第一题 (题号206)
题目:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
难点罗列
- 如何把指针的方向改变
- 如何依次循环
代码实现(先看总体,下面会解释)
struct ListNode* reverseList(struct ListNode* head) {
struct ListNode*newhead = NULL;
struct ListNode*tmp;
while(head)
{
tmp = head-> next;
head->next = newhead;
newhead = head;
head = tmp;
}
return newhead;
我们需要两个指针
经过一次循环后
经过两次循环后
解释每一个指针的作用
- newhead -----------> 目的在于保存上一个的地址
- cur ------------------->目的在于让链表的指向改变
- tmp ------------------>目的在于保存下一个地址
第二题(题号61)
题目:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。
难点罗列
- 如何旋转
- 如何形成一个新的列表
代码实现
struct ListNode* rotateRight(struct ListNode* head, int k) {
if(head == NULL) return NULL;
struct ListNode* tmp = head;
int i = 1;
while(head->next)
{
i++;
head = head->next;
}
head->next = tmp;
k = k%i ;
for(int j =0 ;j<i-k;j++)//目的是找到结尾
{
head = head ->next;
}
tmp = head->next;
head ->next =NULL;
return tmp;
}
如何旋转
解决方法在于:将单链表短暂变成循环列表
这一步的代码实现如下
struct ListNode* tmp = head;
int i = 1;
while(head->next)
{
i++;
head = head->next;
}
head->next = tmp;
这里的 i 变量进行长度的统计,便于下一步的旋转
接下来,需要进行一定的数学分析,k 与长度 i 的关系
发现随着 k 的长度的增大,结果会以 i 为周期的一个变化
然后我们接下里的目的是找到,循环链表需要输出的表尾,然后在这里断开,返回表头
代码实现如下
k = k%i ;
for(int j =0 ;j<i-k;j++)//目的是找到结尾
{
head = head ->next;
}
tmp = head->next;
head ->next =NULL;
return tmp;
今天题目讲解就到这了,诸位早睡。