1、从无头单链表中删除节点
一个没有头指针的单链表。一个指针指向此单链表中间的一个节点(不是第一个也不是最后一个节点)。将该节点删除。
A——>B——>C——>D =====》 A——>C——>D
问题解析:由于只能单向遍历,故与删除B节点,无法得知B的前驱A,即无法像普通删除中那样让A的next指向C;
这里有个技巧,将C当做B,而B复制成C,则删除C节点即可;
2、给定一个链表的头指针,要求只遍历一次,将单链表中的元素顺序反转过来。
A——>B——>C——>D =====》 A<——B<——C<——D
问题解析:由于只能单向遍历,假设A——>B已经反转完成,现实现B<——C;可知由C.pNext = B即可;故每次循环需要保留B和C节点的值;
而翻转后,C无法再指向D会出现链表断裂;故在反转前要注意保留D,即C.pNext;
class ListNode { int pValue; ListNode pNext; public ListNode(int pValue,ListNode pNext) { this.pNext = pNext; this.pValue = pValue; } } public class LinkListEx { public ListNode reverse(ListNode pHead) { if (pHead == null || pHead.pNext == null) return pHead; ListNode pNodeA = pHead; ListNode pNodeB = pHead.pNext; ListNode pNodeC = pHead.pNext.pNext; pHead.pNext = null; while(pNodeB != null) { pNodeB.pNext = pNodeA; pNodeA = pNodeB; pNodeB = pNodeC; if (pNodeB != null) pNodeC = pNodeB.pNext; } return pNodeA; } public void delete(ListNode pNode) { if (pNode == null || pNode.pNext == null) return; //由于题设中简化了难度,假设pNode既非头结点,也非尾节点,故其实不许进行边界判断 ListNode pNext = pNode.pNext; pNode.pValue = pNext.pValue; pNode.pNext = pNext.pNext; } public static void main(String[] args) { ListNode p5 = new ListNode(5, null); ListNode p4 = new ListNode(4, p5); ListNode p3 = new ListNode(3, p4); ListNode p2 = new ListNode(2, p3); ListNode p1 = new ListNode(1, p2); LinkListEx linkListEx = new LinkListEx(); // linkListEx.print(linkListEx.reverse(p1)); linkListEx.delete(p3); linkListEx.print(p1); } public void print(ListNode pHead) { while(pHead != null) { System.out.println(pHead.pValue + "==>"); pHead = pHead.pNext; } } }
时间: 2024-12-17 03:43:43