一、PTA實驗作業
題目1:線性表元素的區間刪除
給定一個順序存儲的線性表,請設計一個函數刪除所有值大於min而且小於max的元素。刪除后表中剩余元素保持順序存儲,並且相對位置不能改變。
1. 設計思路
定義整型變量統計變量n,循環變量i
if (最小值大於等於最大值)
return L
for( i=0 to 鏈表最后)
if ( L->Data[i]滿足條件 )
統計變量n++
否則 L->Data[i-n]=L->Data[i] 剔除不合題意的值
i++ end
L->Last-=n改變鏈表最后位置
2.代碼截圖
3.PTA提交列表說明
4.調試問題
- 思路錯誤:最初始參考課堂派的一道題來做的,后來發現不用那么麻煩,一層循環就可以
題目2:判斷鏈表結點對稱
設計算法,判斷帶頭結點的循環雙向鏈表中的數據結點是否對稱。 如果對稱,輸出“yes” 如果不對稱,輸出“no” 鏈表空則輸出“NULL”
1.設計思路
------------初始化函數-------------
創建頭節點L
L的前后指向自己,構成循環鏈表
銷毀函數
定義L及其下一個節點的代理工作結構體指針s,p
while (p指針沒指到頭結點L)
delete pre刪除前一節點
pre = p;同時向后移
p = p->next;
end p==L循環結束
delete pre 刪除最后節點
--------------輸出函數---------------
定義L下一個節點的代理工作結構體指針s
若L為空 輸出NULL
while(s指針沒指到頭結點L)
輸出s->data
指針后移
end s==L
換行
---------------插入函數--------------
定義計數變量j=0
定義L的代理工作結構體指針p,帶插入節點指針s
while(前i-1個節點且不為空)尋找插入位置
p向后移
j計數++
end j==i-1找到第i-1個元素
s申請空間並給數據域賦值
s->next = p->next 在p后插入s新節點
s->prior = p 雙向
p->next->prior = s
p->next = s
--------------判斷對稱函數-------------
定義L前后節點的代理工作結構體指針s,r
while (s不等於r)
若 s數據域不等於r數據域 不對稱
return 0
否則 繼續循環鏈表
s,r分別向前后移動遍歷鏈表
end 鏈表遍歷結束
return 1 成功循環則對稱
2.代碼截圖
3.PTA提交列表說明
4.調試問題
-
4.1 編譯錯誤:沒有加c++頭文件
-
4.2 運行超時:銷毀函數錯誤
調試過程:
最初在dev運行時答案正確但會停止工作
所以我先把判斷是否對稱函數注釋掉,發現在輸出鏈表后就會停止工作
最后檢查出是銷毀函數的條件錯誤,因為是雙向鏈表,所以在循環到頭結點L時就停止銷毀,而我慣性思維將條件寫成不為空
-
4.3 部分正確:空表輸出NULL
題目3:順序表刪除重復元素
設計一個算法,從順序表中刪除重復的元素,並使剩余元素間的相對次序保存不變。
1. 設計思路
-----------------創建函數----------------
定義循環變量i
若 節點個數n為0 exit 0
為L申請存放空間
for(i=0 to n)
L數據域賦值
end 數據存放結束
鏈表長度=n
------------------輸出函數-----------------
定義循環變量i
for(i=0 to 長度-1)
輸出數據加空格
end 輸出n-1個數據
輸出最后一個數據不加空格
---------------刪除重復元素函數--------------
定義循環變量i=0,j=1,記錄變量len=1
while (j小於長度)遍歷鏈表
for(i=0 to len)
若 有重復元素
break 跳出
若 i==len
剩余元素加入
否則 j++
end
2.代碼截圖
3.PTA提交列表說明
4.調試問題
部分正確:重復元素,只判斷了前后元素是否重復。
二、截圖本周題目集的PTA最后排名
1.順序表PTA排名
2.鏈表PTA排名
3.我的總分:2.5分
三、本周學習總結
1.談談你本周數據結構學習時間是如何安排,對自己安排滿意么,若不滿意,打算做什么改變?
這周的話,幾乎都在PTA上磨時間,有收獲也有失落,可能還沒能將鏈表理解透徹,並不能在題目中較好的使用鏈表。每道題都是極大的挑戰。碰到做不出的操作,我會先百度看完思路后,再自己動手打出來,模仿也是種學習。當自己打完后還有不會的地方,這時會自己思考。我認為這種學習方式很適合自己,會堅持下去。
2.談談你對線性表的認識?
2.1順序表:連續的內存划分及數據存儲
-
性質:
①隨機訪問(查找快,直接定位)
②存儲密度高,只存儲數據元素
③插入、刪除操作需要大量移動元素
-
插入:
①時間復雜度:O(n)
②空間復雜度:O(1)
-
刪除:
①時間復雜度:O(n)
②空間復雜度:O(1)
2.2單鏈表:非連續的內存划分
-
性質:
①逐個遍歷(查找慢)
②存儲密度相對低,存放指針域
③插入、刪除操作快
2.3雙鏈表
在單鏈表的基礎上,結構體增加一個指向前驅結點的prior的指針
2.4循環單鏈表
在單鏈表的基礎上,在表尾的next指向表頭 r->next = L
2.5循環雙鏈表
在循環單鏈表基礎上,結構體增加一個指向前驅結點的prior的指針,加上L->prior = r;r->next = L
3.代碼Git提交記錄截圖
四、閱讀代碼
題目:重排鏈表
void reorderList(ListNode head)
{
if(head == null || head.next == null)
return;
ListNode p = head;
ListNode q = head.next;
while(q != null && q.next != null)
{
p = p.next;
q = q.next.next;
}
//中間節點
q = p.next;
p.next = null;
//將后半段逆序
ListNode rHead = null;
while(q != null)
{
ListNode r = q.next;
q.next = rHead;
rHead = q;
q = r;
}
//向前半段插入
q = rHead;
p = head;
while(p != null && q != null)
{
ListNode rr = q.next;
ListNode lr = p.next;
q.next = lr;
p.next = q;
q = rr;
p = lr;
}
}