题目:
题目一:在O(1)时间内删除链表节点
给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该节点。链表节点定义如下:
struct ListNode { int value; ListNode next; }
void DeleteNode ( ListNode head, ListNode temp )
分析一:
如果节点是尾节点,则,从头结点开始遍历,遍历到前一个节点删除,如果不是,则将要删除节点的后一个节点的值赋值给前一个节点。
代码一:
package offer.xzs.eightteenth;
public class Demo01 {
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(4);
ListNode node4 = new ListNode(5);
ListNode node5 = new ListNode(6);
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(node4);
node4.setNext(node5);
ListNode listNode = deleteNode(head, node2);
System.out.println(listNode);
}
public static ListNode deleteNode(ListNode head, ListNode toBeDelete) {
if (head == null || toBeDelete == null) {
return null;
}
if (toBeDelete.getNext() != null) {
ListNode temp = toBeDelete.getNext();
toBeDelete.setValue(temp.getValue());
toBeDelete.setNext(temp.getNext());
} else {
if (head == toBeDelete) {
head.setNext(null);
} else {
ListNode p = head;
while (p.getNext() != toBeDelete) {
p = p.getNext();
}
p.setNext(null);
}
}
return head;
}
}
题目二:删除链表中重复的节点
在一个排序的链表中,如何删除重复的节点?
分析二:
分两种情况,头节点有重复和头节点没有重复。
代码二:
package offer.xzs.eightteenth;
public class Demo02 {
public static void main(String[] args) {
ListNode head = new ListNode(1);
ListNode node1 = new ListNode(2);
ListNode node2 = new ListNode(3);
ListNode node3 = new ListNode(3);
ListNode node4 = new ListNode(5);
ListNode node5 = new ListNode(6);
head.setNext(node1);
node1.setNext(node2);
node2.setNext(node3);
node3.setNext(node4);
node4.setNext(node5);
ListNode listNode = deleteRepeat(head);
System.out.println(listNode);
}
public static ListNode deleteRepeat(ListNode head) {
if (head == null || head.getNext() == null) {
return head;
}
ListNode cur = head.getNext();
if (head.getValue() == cur.getValue()) {
while (cur != null && head.getValue() == cur.getValue()) {
cur = cur.getNext();
}
return deleteRepeat(cur);
} else {
head.setNext(deleteRepeat(head.getNext()));
return head;
}
}
}