2

# 1.本周学习总结（0-4分）

## 1.1 总结线性表内容

### 顺序表结构体定义


typedef struct{
int *data;
int length;
}SqList;



### 顺序表的创建


void CreateSqList(SqList &L)
{
int i,node,n;
cin>>n;
L->data=new int[n];//动态申请分配n个int内存空间
for(i=0;i<n;i++)
{
cin>>node;
L->data[i]=node;  //可以用下标法表示元素。
}
L->length=n;
}



### 顺序表插入


void InsertSeqlist(SeqList *L, int x, int i)
{
int j;
if(L->length == Maxsize) printf("表已满");
if(i < 1 || i > L->length + 1) printf("位置错"); // 检查插入位置是否合法
for(j = L->length;j >= i;j--)
{
L->data[j] = L->data[j - 1]; // 整体依次向后移动
}
L->data[i - 1] = x;
L->length++;
}




void DeleteSeqList(SeqList *L, int i)
{
int j;
if(i < 1 || i > L->length) printf("非法位置\n");
for(j = i;j < L->length;j++)
{
L->data[j - 1] = L->data[j]; // 依次左移
}
L->length--;
}



### 链表结构体定义


typedef struct Node
{
ElemType data;
struct Node *next;



### 头插法


{
int i;
L = new LNode;
L->next = NULL;
for (i = 0; i < n; i++)
{
s = new LNode;
cin >> s->data;
s->next = L->next;
L->next = s;
}
}



### 尾插法


{
int i;
L = new LNode;
L->next = NULL;
tail = L;
for (i = 0; i < n; i++)
{
s = new LNode;
cin >> s->data;
s->next = NULL;
tail->next = s;
tail = s;
}
}



### 链表插入


void InsertSq(SqList& L, int x)
{
for (int j = L->length; j > 0; j--)
{
if (x >= L->data[j - 1])
{
L->data[j] = x;
break;
}
L->data[j] = L->data[j - 1];
L->data[j - 1] = x;
}
L->length++;
}



### 删除操作


void DispSqList(SqList L)
{
int i = 0;
if (L->length != 0)
{
for (i = 0; i < L->length; i++)
{
cout << L->data[i];
if (i != L->length - 1)
cout << " ";
}
}
else
cout << "error";
}



### 有序表合并


{
LinkList pa = L1->next, pb = L2->next, r, s;
r = L1;
while (pa != NULL && pb != NULL)
{
if (pa->data == pb->data)
{
if (pa->next != NULL)
pa = pa->next;
else
pb = pb->next;
}
if (pa->data < pb->data)
{
s = new LNode;
s->data = pa->data;
pa = pa->next;
r->next = s;
r = s;
}
else
{
s = new LNode;
s->data = pb->data;
pb = pb->next;
r->next = s;
r = s;
}
}
while (pa != NULL)
{
s = new LNode;
s->data = pa->data;
pa = pa->next;
r->next = s;
r = s;
}
while (pb != NULL)
{
s = new LNode;
s->data = pb->data;
pb = pb->next;
r->next = s;
r = s;
}
r->next = NULL;
}



### 循环链表结构特点



【例】在链表上实现将两个线性表(a1，a2，…，an)和(b1，b2，…，bm)连接成一个线性表(a1，…，an，b1，…bm)的运算。

①循环链表中没有NULL指针。

②在单链表中，从一已知结点出发，只能访问到该结点及其后续结点，无法找到该结点之前的其它结点。



### 双链表结构特点


①双链表也是线性表的一种。

②单链表如果想要在指定节点之前插入元素，需要从头遍历找到指定节点的前驱节点，



## 1.2.谈谈你对线性表的认识及学习体会。





# 2.PTA实验作业（0-2分）

## 2.1.题目1：题目名称：6-8 jmu-ds-链表倒数第m个数

### 2.1.2本题PTA提交列表说明。


Q1:未从头结点开始遍历
A1:将j从0开始
Q2:一开始只判断了i-m是否大于0即m位置是否有效，并没有判断P是否等于NULL所以只有部分正确
A2:添加判断条件if(p!=NULL)



## 2.2.题目2：题目名称：6-1 jmu-ds-区间删除数据

### 2.2.2本题PTA提交列表说明。


Q1:顺序表长度未改变
A1:定义j，用j来表示每次变化后的长度
Q2:“线性表为空！”这个文字（这个锅得由输入法来背）
A1:将“!”改为“！”（下次一定不手打，直接复制）



## 2.3.题目3：题目名称：6-10 jmu-ds-有序链表的插入删除

### 2.3.2本题PTA提交列表说明。


Q1:由于用循环但是忘记写跳出循环语句，陷入死循环
A1:添加break和return用于结束循环
Q2:在删除元素部分，尝试用delete结果多次错误
A2:放弃使用delete，当等e时，直接指向e的下一个，从而实现删除



# 3.阅读代码（0--4分）

## 3.1 题目及解题代码

struct ListNode* reverselist(struct ListNode* head)
{
//利用递归将链表逆置

return h;
}

{
while (fast && fast->next)	//让慢指针走到链表中间位置
{
fast = fast->next->next;
slow = slow->next;
}
slow = reverselist(slow);//逆置后半部分的链表
while (slow)//比较前半部分的链表和后半部分的链表是否相同
{
{
return false;
}
slow = slow->next;
}

return true;
}



### 3.1.1 该题的设计思路

使用两个指针，fast和slow指针。

（1）fast指针每次走两步，slow指针每次走一步；

（2）fast指针走到链表末尾的时候，slow指针走到链表的中间位置结点（链表长度n为偶数）或中间位置的前一个结点（链表长度n为奇数）；

（3）slow直接到了中间，就可以将整个链表的后半部分压栈实现逆序，依次和前半部分比较



### 3.1.2 该题的伪代码

struct ListNode* reverselist(struct ListNode* head)
{
//利用递归将链表逆置

return h;
}

{
return true;
while (fast 和 fast->next不为NULL)	//让慢指针走到链表中间位置
fast = fast->next->next;
slow = slow->next;
end while
逆置后半部分的链表
while (slow)
if (前半部分的链表和后半部分的链表不相同)
return false;
end while

return true;
}



## 3.2 题目及解题代码

        if (nullptr == head || nullptr == head->next || nullptr == head->next->next) return head;
int count = 0;
while (p) {
count++;
if (nullptr == p->next) break;
temp = p->next;
p->next = p->next->next;
pre = p;
p = temp;
}

if (count % 2 == 0)
else



### 3.2.1 该题的设计思路

遍历链表，让每个节点都指向其下下个节点，这样就可以把奇偶链给分开，然后再把偶链连接到奇链上即可



### 3.2.2 该题的伪代码


定义count，初值为0；//用于判断积偶
while (p)
count++;
if (nullptr == p->next) break;
temp = p->next;
p->next = p->next->next;
pre = p;
p = temp;
end while

if (count对2取余为0)//为偶
else