在一個排好序的鏈表中存在重複的結點,請刪除該鏈表中重複的結點,重複的結點不保留,並返回鏈表頭指針。 例如,鏈表1->2->3->3->4->4->5 處理後爲 1->2->5。
技術點:鏈表
思路:從頭節點開始如果下個節點與當前節點重複,則找到第一個與當前不同的節點開始遞歸,反之,保留當前結點並從下一個結點開始遞歸
參考代碼:
//節點類ListNode同上
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if (pHead == null || pHead.next == null) {
return pHead;//停止遞歸條件
}
if (pHead.val == pHead.next.val) {
//如果下個節點與當前節點重複,則找到第一個與當前不同的節點開始遞歸
ListNode pNode = pHead.next;
while (pNode != null && pNode.val == pHead.val) {
pNode = pNode.next;
}
return deleteDuplication(pNode);
} else {
//反之,保留當前結點,並從下一個結點開始遞歸
pHead.next = deleteDuplication(pHead.next);
return pHead;
}
}
}
輸入一個鏈表,輸出該鏈表中倒數第k個結點。
技術點:鏈表
思路:用p1、p2指向鏈表頭部,先讓p1走(k-1)步到達第k個節點,此時p1和p2相隔k個節點;然後p1、p2同時往後移動,當p1到達鏈尾時,p2所在位置正是倒數第k個節點
參考代碼:
//節點類ListNode同上
public class Solution {
public ListNode FindKthToTail(ListNode head,int k) {
if(head==null||k<=0){
return null;
}
ListNode p1=head;
ListNode p2=head;
//p1先到達第k個節點處
for(int i=1;i<k;i++){
if(p1.next!=null){
p1=p1.next;
}else{
return null;
}
}
//p1走到鏈尾時p2正爲倒數第k個節點
while(p1.next!=null){
p1=p1.next;
p2=p2.next;
}
return last;
}
}
by .k
關注"編程v",每一天漲一點
STAY HUNGRY & STAY FOOLISH