件名の説明:
ソートされたリンクリストのノードが重複して、重複したノードのリストを削除し、ノードが繰り返さ保持していない、ヘッド・ポインタ・リストを返します。
例えば、リスト4-> 5が処理され> 2-> 3-> 3-> 4-> 1- 1-> 2-> 5
アイデアの分析:
二つのアイデア:
リストの最初のノードを指すポインタを設定することができ、再帰を使用する第1の方法は、我々は、ヘッドノードを通過起動しない、重複したノード値を削除することが下方トラバーサル場合、現在のノードと次のノードの値が等しいかどうか判断されますそれは最初のノードが等しくない遭遇するまで、開始点からリストの新しいヘッドは、上記の動作は、次のノードが繰返さない見つけるために繰り返されます。
第二の方法は、再帰、上記と同じ考え方とを使用することです。
コード:
この方法の一つ:
/*public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null)
return null;
if(pHead.next==null)
return pHead;
ListNode first=new ListNode(-1);
first.next=pHead;
ListNode last=first;
ListNode pNode=pHead;
while(pNode!=null&&pNode.next!=null){
if(pNode.val==pNode.next.val){
int val=pNode.val;
while(pNode!=null&&pNode.val==val){ //切记在链表中循环遍历一定要判断当前节点是否为空。
pNode=pNode.next;
}
last.next=pNode;
}else{
last=pNode;
pNode=pNode.next;
}
}
return first.next;
}
}
方法2:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public ListNode deleteDuplication(ListNode pHead)
{
if(pHead==null)
return null;
if(pHead.next==null)
return pHead;
if(pHead.val==pHead.next.val){
ListNode pNode=pHead;
int val=pNode.val;
while(pNode!=null&&val==pNode.val){
pNode=pNode.next;
}
return deleteDuplication(pNode); //找到第一个不重复的点开始递归。
}else{
pHead.next=deleteDuplication(pHead.next); //如果当前节点不是重复的保存下来,从下一个节点开始递归。
return pHead;
}
}
}