上篇博客里,还说,每天至少一道题,看来我食盐了- -。
等等,说的好像你第一次食盐?别闹了,懒鬼。。行吧
题目描述:
代码:
class ListNode {
int val;
ListNode next;
public ListNode(int val, ListNode next) {
this.val = val;
this.next = next;
}
}
public class Design {
public static ListNode deleteSomeNodeEfficiency(ListNode first, ListNode deleteNode) {
if (first == deleteNode) {
if (deleteNode.next == null) {
// 这里总感觉不太对呢?先这样写吧 ...
return null;
} else {
first = first.next;
deleteNode.next = null;
}
} else {
if (deleteNode.next == null) {
ListNode head = first;
while (head.next != deleteNode) {
head = head.next;
}
head.next = null;
} else {
deleteNode.val = deleteNode.next.val;
ListNode temp = deleteNode.next;
deleteNode.next = deleteNode.next.next;
temp.next = null;
}
}
return first;
}
public static void showListNode(ListNode list) {
while (list != null) {
System.out.print(list.val + " ");
list = list.next;
}
System.out.println();
}
public static void main(String[] args) {
ListNode fiveth = new ListNode(5, null);
ListNode fourth = new ListNode(4, fiveth);
ListNode third = new ListNode(3, fourth);
ListNode second = new ListNode(2, third);
ListNode first = new ListNode(1, second);
showListNode(first);
ListNode newList = deleteSomeNodeEfficiency(first, fiveth);
showListNode(newList);
}
}
好吧,作为一个思考全面的程序猿,依照书本的思想,还需要考虑要删除的结构在不在以first为首节点的链表中。
题目二:
代码:
class Nodes {
int val;
Nodes next;
public Nodes(int val, Nodes next) {
this.val = val;
this.next = next;
}
}
public class DesignAnother {
public static Nodes deleteRepeatNodes(Nodes head) {
if (head == null) {
return null;
}
Nodes iter = head;
int times = 0;
while (iter != null && iter.next != null && iter.val == iter.next.val) {
times = 0;
while (iter != null && iter.next != null && iter.val == iter.next.val) {
times++;
iter = iter.next;
}
if (times > 0 && iter != null) {
iter = iter.next;
}
}
if (iter == null) {
return null;
}
head = iter;
Nodes preNode = head;
Nodes handleNode = preNode.next;
while (handleNode != null) {
Nodes temp = handleNode.next;
int repeatTimes = 0;
while (temp != null && handleNode.val == temp.val) {
repeatTimes++;
temp = temp.next;
}
if (repeatTimes == 0) {
preNode = handleNode;
handleNode = preNode.next;
} else {
preNode.next = temp;
handleNode = temp;
}
}
return head;
}
public static void visitNodes(Nodes head) {
Nodes node = head;
while (node != null) {
System.out.print(node.val + " ");
node = node.next;
}
System.out.println();
}
public static void main(String[] args) {
Nodes eight = new Nodes(0, null);
Nodes sevent = new Nodes(2, eight);
Nodes six = new Nodes(9, sevent);
Nodes five = new Nodes(0, six);
Nodes four = new Nodes(9, five);
Nodes three = new Nodes(9, four);
Nodes second = new Nodes(9, three);
Nodes one = new Nodes(1, second);
visitNodes(one);
visitNodes(deleteRepeatNodes(one));
}
}
在java里没有类似于c++那样delete回收对象的方式,所以这样写比较妥。