[Algorithms] Array & Linked List
反转链表(简单)
问题链接:reverse-linked-list
- 非递归方式
public ListNode reverseList(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
- 递归方式
public ListNode reverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode newNode = reverseList(head.next);
newNode.next = head;
head.next = null;
return newNode;
}
两两交换链表中的节点(中等)
问题链接:swap-nodes-in-pairs
- 非递归方式
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode dummy = new ListNode(0);
ListNode prev = dummy;
dummy.next = head;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
if (next == null) {
break;
}
prev.next = next;
curr.next = next.next;
next.next = curr;
prev = curr;
curr = curr.next;
}
return dummy.next;
}
- 递归方式
public ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode next = head.next;
head.next = swapPairs(next.next);
next.next = head;
return next;
}
环形链表(简单)
问题链接:linked-list-cycle
public boolean hasCycle(ListNode head) {
ListNode slow = head;
ListNode fast = head;
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
if (slow == fast) {
return true;
}
}
return false;
}
环形链表ii(中等)
问题链接:linked-list-cycle-ii
public ListNode detectCycle(ListNode head) {
ListNode tortoise = head;
ListNode hare = head;
while (hare != null && hare.next != null) {
tortoise = tortoise.next;
hare = hare.next.next;
if (tortoise == hare) {
tortoise = head;
while (tortoise != hare) {
tortoise = tortoise.next;
hare = hare.next;
}
return tortoise;
}
}
return null;
}
K 个一组翻转链表(困难)
- 顺序执行的方式,分组反转,然后合并结果
public ListNode reverseKGroup(ListNode head, int k) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode prev = dummy;
ListNode end = dummy;
while (end.next != null) {
ListNode start = prev.next;
for (int i = 0; i < k && end != null; i++) {
end = end.next;
}
if (end == null) {
break;
}
ListNode next = end.next;
end.next = null;
prev.next = reverse(start);
start.next = next;
prev = start;
end = prev;
}
return dummy.next;
}
public ListNode reverse(ListNode head) {
if (head == null || head.next == null) {
return head;
}
ListNode pre = null;
ListNode curr = head;
while (curr != null) {
ListNode next = curr.next;
curr.next = pre;
pre = curr;
curr = next;
}
return pre;
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
作者: | ljtletters |
博客地址: | http://www.cnblogs.com/ljtletters |
博客版权: | 本文以学习、研究和分享为主,欢迎转载,但必须在文章页面明显位置给出原文连接。 如果文中有不妥或者错误的地方还望高手的你指出,以免误人子弟。如果觉得本文对你有所帮助不如【推荐】一下!如果你有更好的建议,不如留言一起讨论,共同进步!再次感谢您耐心的读完本篇文章。 |